python面向对象的继承-组合-02 (3)

调用方式:# 类.mro() --> 可以获取到类的 **mro 列表**,里面的元素就是类的查找顺序

class Parent: pass class Sub(Parent): pass print(Sub.mro()) # [<class '__main__.Sub'>, <class '__main__.Parent'>, <class 'object'>] # 从左到右就是这个类的查找顺序,先Sub自身 再Parent 再object

​ 当使用super()函数时,python3会在mro列表上继续搜索下一个类。如果每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个mro列表,每个方法也只会被调用一次

注意注意注意:使用super调用的所有属性,都是从mro列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看mro列表

类的属性的查找顺序 新式类中的菱形继承

1564057060708

新式类中的查找顺序

类的属性查找顺序:

新式类:先找自身,再先深度找,如果有共同父类再广度找(直接看类的mro列表就知道查找顺序了 类.mro() )

经典类: python2中的经典类就是深度优先

# 此段代码指定时python2 运行 # 注释掉不同类中的num 来测试查找顺序 class B: # num = 2 pass class C: # num = 3 pass class E(B): # num = 5 pass class F(C): # num = 6 pass class G(C): num = 7 pass class H(E, F, G): # num = 8 pass print(H.num) # print(H.mro()) # python2 中没有 mro() # [<class '__main__.H'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.F'>, <class '__main__.G'>, <class '__main__.C'>, <class 'object'>] # [H, E, B, F, G, C, object] ---> 上面的mro简化表示顺序(这是python3 的顺序) # [H, E, B, F, C, G, object] ---> 这是python2 的顺序 > 初次用markdown上传博客哦,如有不好还请见谅~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyjdw.html