- 面向对象 - 断浪狂刀忆年少 - 博客园 (cnblogs.com)
- 通过函数实现面向对象编程
- 面向对象的思维内涵
- 只关心程序中有多少角色
- 每个角色有什么方法,有什么属性
- 所有角色都是由一个模板创建的
- 所有属性和技能都待在自己的角色模板中--------可读性好
- 能够更加方便得为角色添加技能或属性----------可扩展性好
- 面向对象有个非常重要的关健侧--抽象
- 只关心程序中有多少角色
- class 类名:
- 类名一般首字母要求大写
- 类内定义的变量为类的属性,查看类的属性如Car.color
- 类属性和实例属性的区别
- 概念,类属性是类的属性,实例属性是对象属性
- 使用,类属性可以通过类也可以通过实例调用,实例属性只能实例调
- 概念,类属性是类的属性,实例属性是对象属性
- 类属性和实例属性的区别
- 变量=类名(),变量实例化成对象
- __init__(self, , , )初始化方法
- 在实例化的同时就会调用,实例化的同时会开辟一块内存
- __new__创造空间给对象,然后__init__初始化
- 不需要写返回值,默认return None不能改
- 在实例化的同时就会调用,实例化的同时会开辟一块内存
- 通过对象.方法()调用 = 类.方法(对象),但是推荐用对象调用
- __main__指当前文件
- 函数名一般小写字母开头
- 类名一般首字母要求大写
- 对象名
- 对象.属性 查看对象属性
- 对象.方法名 调方法
- 对象.属性 查看对象属性
- 静态变量
- 类变量,类的属性
- 操作静态变量时,如果是查看,用类和对象都可以
- 如果是修改,尽量使用类名修改,这样不会出错
- 用对象修改静态变量只要用到了赋值,相当于在自己的对象空间内新建属性,并不能修改类空间的内容
- 类变量,类的属性
- 组合
- 对象可以作为另一个类的属性
- 对象可以作为另一个类的属性
- 什么是面向对象
- 一切皆对象
- 内置的类
- str int bool list dict tuple set
- 内置的类不需要定义可以直接调用
- str int bool list dict tuple set
- 一切皆对象
- 面向对象三大特性----类的三大特性面向对象的三大特性 - 断浪狂刀忆年少 - 博客园 (cnblogs.com)
- 封装
- 广义上的封装
- 把方法和变量都封装在类中
- 在类的外部不能直接调用
- 把方法和变量都封装在类中
- 狭义上的封装
- 私有化方法和属性
- 在类的内部,实例变量(对象属性)可以变成私有的,类的变量可以变成私有的,实例的方法可以变成私有的,一旦变成私有的就只能在类的内部使用
- 不能在类的外部使用
- 不能继承
- 在类的内部,实例变量(对象属性)可以变成私有的,类的变量可以变成私有的,实例的方法可以变成私有的,一旦变成私有的就只能在类的内部使用
- 私有化方法和属性
- 广义上的封装
- 继承
- 多态
- 通过继承来实现
- python中处处是多态
- 多态的好处
- 定义一个函数func( a )传入一个对象a
- 在函数内调用对象的某个方法a.fun(),返回结果
- 由于多态性质,传入对象不同,函数func的运算过程和返回结果不同
- 思考了一下,反射结合多态应该很实用,定义一个数据类,增删改查四个子类继承数据类,传入一条SQL,判断类型,然后实例化对应的类,反射写入SQL到对象属性,这时定义一个调用数据库的方法,传入的对象不同,就可以做增删改查
- 定义一个函数func( a )传入一个对象a
- 通过继承来实现
- 封装
- 面向对象的三个装饰器
- '@property'
- 将一个方法伪装成属性,调用时就不用加括号了
- 将一个方法伪装成属性,调用时就不用加括号了
- '@staticmethod'
- 声明类的方法是静态方法,不用传任何默认参数,不实例化,类名/对象+方法名可以直接调用
- 与类和对象没什么直接关系的方法,不获取类也不获取 对象,可以改写到类外面用普通函数
- 便于管理组织代码
- 声明类的方法是静态方法,不用传任何默认参数,不实例化,类名/对象+方法名可以直接调用
- '@classmethod'
- 装饰当前的方法为类方法,默认参数cls,cls指的就是当前类
- 用cls表示当前类的内存地址
- 在方法中像获取实例相关的数据,比如获取实例本身,或者实例的属性,或者调用其他实例方法,用实例方法
- 在方法中获取类相关的数据,比如类属性,类本身,其他的类方法
- 装饰当前的方法为类方法,默认参数cls,cls指的就是当前类
- '@property'
- 类直接调用实例方法的问题