属性的查找
单继承情况下:无论新式类还是经典类查找顺序都是一样的。
先obj——>类——>父类——>……
class Foo: def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() #obj.f1() class Bar(Foo): def f1(self): print('Bar.f1') obj=Bar()#调用Bar()生成对象 obj.f2()#在obj中查找f2,不存在,Bar类中查找不到,查找父类中是否有f2,有执行 #obj中查找f1,不存在,Bar类中找到执行。 #Foo.f2 #Bar.f1
在多继承的背景下,如果一个子类继承了多个分支,但是多个分支没有汇聚到一个非object类,无论是新式类还是经典类属性的查找顺序是一样的
会按照从左到右的顺序一个分支一个分支的查找。
class F: x="F" class E: x="E" class D: x="D" class C(F): x='C' class B(E): x='B' class A(B,C,D): x="A"
想要查找的属性的属性 obj-->A-->B-->E-->C-->F-->D-->object
在继承背景下,如果一个子类继承了多个分支,但是多分支最后汇聚一个非object类(菱形继承问题)
class G: x="G" class F(G): x="F" class E(G): x="E" class D(G): x="D" class C(F): x='C' class B(E): x='B' class A(B,C,D): x="A"
这是属性检索的关系就会因为新式类还是经典类产生不同。
新式类(广度优先查找原则):obj-->A-->B-->E-->C--->F--->D-->G-->object
经典类(深度优先查找原则):obj-->A-->B--->E-->G-->C-->F--->D--->object
在Python3中提供了一种方法可以查看属性的检索的顺序的列表。
print(A.mro()) #[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]