面向对象——属性的查找

属性的查找

单继承情况下:无论新式类还是经典类查找顺序都是一样的。

先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'>]

猜你喜欢

转载自www.cnblogs.com/msj513/p/9837284.html