zoukankan      html  css  js  c++  java
  • 面向对象——属性的查找

    属性的查找

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

    先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'>]
  • 相关阅读:
    CF 118E Bertown roads 桥
    hdu 3917 Road constructions 最大权闭合子图
    hdu 4714 Tree2cycle 树形经典问题
    POJ 2516 Minimum Cost 最小费用流
    POJ 3921 Destroying the bus stations 沿着最短路迭代加深搜索
    POJ 3422 Kaka's Matrix Travels K取方格数
    BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增
    hdu 4010 Query on The Trees LCT
    poj 2455 Secret Milking Machine 二分+最大流 sap
    定制标记---简单标记处理器
  • 原文地址:https://www.cnblogs.com/msj513/p/9837284.html
Copyright © 2011-2022 走看看