Python - 面向对象编程 - 使用 super() 的一些注意事项

简介: 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
相关文章
|
4天前
|
Python
python基础篇:面向对象编程
python基础篇:面向对象编程
21 0
|
4天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
2天前
|
程序员 Python
python学习1:安装注意事项(1),2024年最新3个月学会Python开发
python学习1:安装注意事项(1),2024年最新3个月学会Python开发
python学习1:安装注意事项(1),2024年最新3个月学会Python开发
|
4天前
|
Python
Python中的面向对象
【5月更文挑战第4天】面向对象编程(OOP)是Python的核心,涉及类与对象、封装、继承和多态。类是对象的模板,对象则是类的实例。例如,`Person`类有`__init__`构造方法和`greet`方法。
15 3
|
4天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
4天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)
|
4天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)
|
4天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
4天前
|
数据安全/隐私保护 Python
python代码加密以及注意事项分享
假设你已经有了一个 Python 程序 `main.py`。确保它在你的环境中可以正常运行。
|
4天前
|
设计模式 算法 程序员
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践