方法的解析顺序表
知识点
背景
- 调用父类方法的几种方式
- 继承的父类名.方法(self, 参数)
- super().方法(参数)
- super(继承的父类名, self).方法(参数)
父类名.方法(self, 参数)
1 | class Parent(Object): |
缺点:这种方式对于多继承可能会产生多次调用爷爷级别的继承类
super().方法(参数)
1 | class Parent(Object): |
备注:这种方式创建的对象中继承类的顺序是按照【对象名.__mro__】返回值的顺序调用的,使用它可以一次性调用所有继承的父类。
super(继承的父类名, self).方法(参数)
1 | class Parent(Object): |
备注:这类方式可以决定调用被继承父类方法的优先级,同时也可以决定不调用被继承其它父类的方法
其它
对象名.__mro__:
通过该方法可以打印出当前对象中调用的所有的父类、父类被调用的顺序。它的实现是通过c3算法实现,返回值是调用的类的元组
多继承中父类方法调用顺序
根据【对象名.__mro__】返回的元组信息(b),我们将实例化对象的类名(a)拿到元组b中依次进行比对,当其中一个符合时就会调用紧跟该类中的下一个类名,直至结束
类属性的寻找顺序
在Python中,类变量在内部是作为字典处理的。如果一个变量的名字没有在当前类的字典中发现,则将搜索祖先类(比如父类)直到被引用的变量名被找到,如果这个变量名既没有在当前类中被寻找到,也没有祖先类中被找到,则会返回一个Attribute异常
1 | class Parent(Object): |
作业
- (问答)请简述在子类中调用父类方法的三种方式
- (问答)通过【继承的父类名.方法(self, 参数)】这种方式调用父类的方法,存在的问题是什么?
- (问答)通过【super().方法(参数)】方式调用父类的方法,它父类的调用顺序是什么样的
- (问答)通过【super(继承的父类名, self).方法(参数)】方式调用父类的方法,它父类的调用顺序是什么样的
- 打印出当前对象中调用的父类方法
- (问答)请简述类属性在类中的查找顺序