Python多继承 super 的一些现象
2022/2/8 17:17:38
本文主要是介绍Python多继承 super 的一些现象,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
今天学习多继承,遇到了super继承顺序的问题
A是父类,BC继承A,D多继承BC
class A: def __init__(self): print("A") class B(A): def __init__(self): print('B') super().__init__() class C(A): def __init__(self): print('C') super().__init__() class D(B, C): def __init__(self): super().__init__() d= D()
则会得到结果
B C A
D.__mro__
为(__main__.D, __main__.B, __main__.C, __main__.A, object)
如果稍作修改,注释掉B类中的super
class A: def __init__(self): print("A") class B(A): def __init__(self): print('B') # super().__init__() class C(A): def __init__(self): print('C') super().__init__() class D(B, C): def __init__(self): super().__init__() d= D()
则会得到结果
B
说明没有执行C的init
python3中的多继承顺序依赖于方法解析顺序(MRO)
执行到B的init后,如果需要执行A的init话,才需要执行C的init。如果不执行A的init话,C的init也无需执行。
另一种情况,如果注释掉C的super
class A: def __init__(self): print("A") class B(A): def __init__(self): print('B') super().__init__() class C(A): def __init__(self): print('C') # super().__init__() class D(B, C): def __init__(self): super().__init__() d= D()
得到结果
B C
根据MRO,先是B的init,B的init调用A的init,但是想要调用A的init需要根据顺序先调用C的init,C的init中没有super,执行完C的init程序结束
这篇关于Python多继承 super 的一些现象的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03用FastAPI掌握Python异步IO:轻松实现高并发网络请求处理
- 2025-01-02封装学习:Python面向对象编程基础教程
- 2024-12-28Python编程基础教程
- 2024-12-27Python编程入门指南
- 2024-12-27Python编程基础
- 2024-12-27Python编程基础教程
- 2024-12-27Python编程基础指南
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型