Python - 面向对象编程 - 使用 super() 的一些注意事项
2021/9/7 1:06:29
本文主要是介绍Python - 面向对象编程 - 使用 super() 的一些注意事项,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
super() 详解
https://www.cnblogs.com/poloyy/p/15223443.html
多继承中使用 super()
class A: def test(self): print("AAA") class B: def test(self): print("BBB") class C(A, B): def test(self): print("CCC") super().test() c = C() c.test() # 输出结果 CCC AAA
根据 MRO,super() 很明显调用的是 A 类的 test() 方法
假设想调用 B 类的 test() 方法,要怎么做呢?
方式
class C(A, B): def test(self): print("CCC") super().test() B.test(self) # 输出结果 CCC AAA BBB
通过 父类名.方法名() 即可,但这样和 super() 混用,不是一个好编码习惯,具体看下面
混用super() 和 显示类调用
class A: def __init__(self): print("A", end=" ") super().__init__() class B: def __init__(self): print("B", end=" ") super().__init__() class C(A, B): def __init__(self): print("C", end=" ") A.__init__(self) B.__init__(self) print("MRO:", [x.__name__ for x in C.__mro__]) C() # 输出结果 MRO: ['C', 'A', 'B', 'object'] C A B B
B 类的 __init__() 方法被调用了两次
为什么呢?
- C 类里面又通过 B.__init__() 显式的调用了一次
- 从 MRO 可以看到,A 类后面跟的是 B 类,所以 A 类的 super() 会调用 B 类
- 一共调用了两次
如何避免
- 在多继承场景中,super() 的使用必须一致,即在类的层次结构中,要么全部使用 super(),要么全不用!坚决不混用
- 继承父类时应该查看类的层次结构,就是使用类的 __mro__ 属性,或者 mro() 方法查看相关类的 MRO
这篇关于Python - 面向对象编程 - 使用 super() 的一些注意事项的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南