085 属性的查找顺序
一、属性的查找顺序
1.1 如何重用父类的属性
- 对象所在的类继承父类的属性
1.2如何重用父类的方法
- 对象所在的类继承父类的方法
1.3 单继承
class Person(object):
school = 'oldboy'
def __init__(self, name, age):
self.name = name
self.age = age
class Teacher(Person):
pass
class Student(Person):
pass
stu1 = Student()#报错,因为父类中必须传两个参数
- 这样实例化对象时会报错的,因为我们之前学过对象的属性查找顺序是先从对象自己开始找,然后去它的类中找,并且我们在实例化对象的时候是自动触发对象所在类的init方法的,这里我们的这个student类虽然没有init方法,那这个时候就是我们说的在继承中属性的查找顺序了
- 先是去对象自己的属性里找--->类里面找--->父类里去找-->找不到报错
1.4 多层继承
class A:
a="AAAA"
class B(A):
a="BBB"
class C(B):
a="CCC"
pass
class D(C):
a = "DDD"
pass
1.5 多继承
- 一个类继承多个父类,子类(父类1,父类2,父类3)
class A:
a="AAAA"
pass
class B:
a="BBB"
pass
class C:
a="CCC"
pass
class D(A,B,C):
a = "DDD"
pass
1.6 多继承的多层
1.6.1 继承的菱形问题
菱形问题(显示的都继承一个类,不是object类(py3中全是新式类)
- 继承的菱形问题:新式类和经典类的查找顺序是不一样的
- 新式类的查找顺序:广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
- 经典类的查找顺序:只有python2中才有经典类,深度优先(包括菱形---从左侧开始,一直往上找,找到菱形的顶点结束顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)
class A:
a = 1
pass
class B(A):
a = 2
pass
class C(A):
a= 3
pass
class D(A):
a = 4
pass
class E(B):
a = 5
pass
class F(C):
a = 6
pass
class G(F,E,D):
a = 7
pass
a= G
print(a.a)
1.6.2 不出现菱形问题
- 正常顺序找
1.6.3 __mro__来看查找顺序
- 是字类的继承父类的查找顺序
print(G.__mro__)
(<class 'main.G'>, <class 'main.F'>, <class 'main.C'>, <class 'main.E'>, <class 'main.B'>, <class 'main.D'>, <class 'main.A'>, <class 'object'>)