• 面向对象——属性的查找


    属性的查找

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

    先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'>]
  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/msj513/p/9837284.html
Copyright © 2020-2023  润新知