zoukankan      html  css  js  c++  java
  • 继承&派生 属性查找

    #单继承背景下,无论是新式类还是经典类属性查找顺序都一样
    # 先object->类->父类->...

    实例:

    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()
    obj.f2()  

    结果:

    Foo.f2
    Bar.f1
    # 在多继承背景下,如果一个子类继承了多个分支,但是多个分支没有汇聚到一个非object类,无论是新式类还是经典类属性查找顺序都一样:
    # 会按照从左到右的顺序一个分支一个分支的查找下去

    实例:

    class E:
        xxx='E'
        pass
    
    class F:
        xxx='F'
        pass
    
    class B(E):
        xxx='B'
        pass
    
    class C(F):
        xxx='C'
        pass
    
    class D:
        xxx='D'
        pass
    
    class A(B,C,D):
        xxx='A'
        pass
    
    obj=A()
    # obj.xxx=111
    print(obj.xxx)  #查找xxx
    print(A.mro())

    结果:

    A
    [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>,<class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class 'object'>]
    # 在多继承背景下,如果一个子类继承了多个分支,但是多个分支最终汇聚到一个非object类(菱形继承问题)
    # 新式类:广度优先查找:obj->A->B->E->C->F->D->G->object
    # 经典类:深度优先查找:obj->A->B->E->G->C->F->D (只有出现菱形继承的python2中)
     
    #实例:
    class G:
        xxx='G'
    
    class E(G):
        xxx='E'
        pass
    
    class F(G):
        xxx='F'
        pass
    
    class B(E):
        xxx='B'
        pass
    
    class C(F):
        xxx='C'
        pass
    
    class D(G):
        xxx='D'
        pass
    
    class A(B,C,D):
        xxx='A'
        pass
    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'>]

    属性查找顺序

        总的来说:属性查找就是按照MRO列表进行的。

  • 相关阅读:
    MySQL的FORMAT函数用法规则
    MySql 里的ifnull、nullif、isnull和if用法
    分布式中ID的常用解决方案
    Java多线程问题总结
    Mysql当前日期加减一个月
    Spring Boot浅谈(是什么/能干什么/优点和不足)
    Vue.js 入门教程
    Git服务器的搭建与简单使用教程
    阿里巴巴-德鲁伊druid连接池配置
    一些安卓实用代码
  • 原文地址:https://www.cnblogs.com/TF511/p/9838704.html
Copyright © 2011-2022 走看看