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


    属性的查找

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

    先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'>]
  • 相关阅读:
    idea 将java导出为可执行jar及导入jar依赖
    使用idea 调试java -jar xxx.jar方式启动
    springboot 打成的jar包在ClassLoader().getResource方法读取文件为null
    maven 使用dependencyManagement统一管理依赖版本
    Win10系列:C#应用控件基础5
    Win10系列:C#应用控件基础4
    Win10系列:C#应用控件基础3
    Win10系列:C#应用控件基础2
    Win10系列:C#应用控件基础1
    Win10系列:UWP界面布局进阶9
  • 原文地址:https://www.cnblogs.com/msj513/p/9837284.html
Copyright © 2020-2023  润新知