类和对象¶
类:
- 类的命名:
- 必须遵循命名规范,避开系统命名
- 必须用关键字class
- 类由属性和方法构成,不能出去其他
- 成员属性定义可以使用变量赋值,也可以为None
- 类的实例化:
- 变量 = 类名()
- 类对象成员的访问
- obj.成员属性名 或者 obj.成员方法
- self
- self不是关键字,只是用于接收对象的普通参数
- 方法中有self形参的方法为非绑定类方法,可以通过对象访问,没有self的为绑定类,只能通过类访问
- 使用类访问绑定类的方法时,如果类方法要访问当前类的成员,可以通过__class__.成员名
- 如:class A(): a = "hello" def B(); print(__class__.a)
- 构造方法中,self参数(第一个参数)代表改构成方法正在初始化的对象
- Python对象的一个方法调用另一个方法的时候,不可省略self
- 类实例的属性和其对象的实例属性在不对对象属性赋值的前提下,指向同一变量
重写父类
- 子类包含与父类同名的方法
封装、继承和多态
封装
- 封装对对象的成员进行访问限制
- 封装:公开、受保护及私有
- 公开
- 没有对成员进行任何操作
- 类中,子类及外部都可以进行访问
- 受保护
- 封装方法:在成员名称前加一个下划线即可
- 类或者子类都可以访问,外部不能进行访问
- Python目前不支持受保护的成员,只是开发者约定的使用方式
- 私有
- 封装方法:在成员前面添加两个下划线即可
- Python其实没有真正的隐蔽机制,双下划线只是Python的一个小技巧: __attributename改成_classname__attributename
- 公开
继承
- 子类继承父类的语法是在定义子类时,在子类的圆括号里放入父类(可以放入多个父类)
- 如:class SubClass(SuperClass,...):
- Python中定义类并未指定这个类的直接父类,则这个类默认继承object类
- 被继承的类被称为父类,也可以称为基类或超类
- 子类继承父类后并没有将所有的成员赋值到子类中,而是通过引用关系访问调用
- 子类与父类有定义相同成员时,子类优先使用子类成员
- 子类扩充父类的方法,可以在新定义的方法中访问父类的成员来重用
- 可以使用父类名.父类成员名或者super().父类成员名的格式来调用
- 子类可以有独有的成员和方法
- 构造函数
- 在类进行实例化之前进行调用
- 子类如果定义了构造函数,则实例化时使用构造函数,不查找父类构造函数
- 如果子类没有构造函数,父类构造函数带参数,则构造对象时要按父类参数构造
- super
- 不是关键字,是个类
- 获取MRO列表中的第一个类
- super与父类没有实质性关系,但可以调用父类
- 多继承
- 一个子类有多个直接父类
- 如:class SubClass(SuperClass1,SuperClass2):
- Python中虽然支持多继承,但是不推荐在没必要的情况下使用,避免麻烦
- MRO是多继承中用于保护继承顺序的一个列表
- MRO列表的计算原则:
- 子类永远在父类前面
- 如果多个父类,则根据继承语法中括号内的顺序存放
- 如果多个类继承同一个父类,则子孙类只会选取继承语法括号中的第一个父类的父类
- 使用多继承来实现Mixin
- 使用Mixin实现多继承的时候要小心
- 首先它必须是表示一单一功能,而不是某个物品
- 职责必须单一,如果有多个功能,则写多个Mixin
- Mixin不能依赖子类的实现
- 子类即使没有继承这个Mixin类,也能照样工作,只是缺少某个功能
多态
- 同一个对象在不同情况下有不同的状态出现
检测类型
- issubclass(cls,class_or_tuple):检测一个类是否是另一个类的子类
- isinstance(obj,class_or_tuple):检测一个对象是否是另一个类的实例
- hasattr(obj,name):检测一个对象是否存在某成员
- setattr(obj,name,values):给对象的属性赋值,若属性不存在,先创建再赋值
- getattr(object, name[,default]):获取对象的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号
- del(obj,name):删除对象属性
- dir([obj]):获取对象的成员列表
property函数定义属性
- 语法格式 :property(fget,fset,fdel,doc)
- 可根据需要只传入少量的参数
类内置属性
- __bases__属性是Python提供的一个为所有类查找该类父类的属性,该属性返回所有直接父类组成的元组
- __subclasses__()方法是Python提供一个为所有类查找该类子类的方法,该方法返回所有直接子类的列表
- __dict_-以字典的方式显示类的成员组成
- __doc__获取类的文档信息
- __name__获取类的名称,如果在模块中使用 ,则获取模块名称
魔法函数
- __new__:对象实例化方法,一般不使用
- __init__:构造函数
- __call__:对象当函数使用的时候触发
- __str__:当对象被当字符串使用时触发
- __repr__:
- __setattr__:该方法不能直接对属性进行赋值,否则陷入死循环
类和对象的三种方法
- 实例方法
- 需要实例化对象才能使用的方法
- 静态方法
- 使用装饰器@staticmethod。不需要实例化,通过类来直接访问,但是方法体中不能使用类或实例的任何属性和方法
- 类方法
- 使用装饰器@classmethod。需要实例化,第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)