super()函数的核心在于根据MRO顺序动态调用“下一个”方法,而非简单调用父类。在多重继承中,它确保每个方法只被调用一次且顺序正确,避免重复执行与硬编码,提升代码灵活性与可维护性。Python 3中简化了语法,无需传参,自动推断上下文,使代码更简洁安全。掌握super()有助于实现协作式继承和模块化设计,是构建健壮面向对象系统的关键。

super()
我个人觉得,
super()
很多初学者,甚至一些有经验的开发者,对
super()
__init__
super().some_method()
some_method
举个例子,假设我们有一个类A,一个类B继承A,一个类C继承B。在C中调用
super().__init__()
__init__
super().__init__()
__init__
__init__
__init__
super()
super()
Parent1.__init__(self)
Parent2.__init__(self)
立即学习“Python免费学习笔记(深入)”;
class Grandparent:
def __init__(self):
print("Grandparent.__init__")
class Parent1(Grandparent):
def __init__(self):
super().__init__() # 调用Grandparent.__init__
print("Parent1.__init__")
class Parent2(Grandparent):
def __init__(self):
super().__init__() # 调用Grandparent.__init__
print("Parent2.__init__")
class Child(Parent1, Parent2): # 多重继承,注意顺序
def __init__(self):
super().__init__() # 按照MRO顺序调用
print("Child.__init__")
# 观察MRO
print(Child.__mro__)
# (<class '__main__.Child'>, <class '__main__.Parent1'>, <class '__main__.Parent2'>, <class '__main__.Grandparent'>, <class 'object'>)
# 创建实例
c = Child()
# 输出会是:
# Grandparent.__init__
# Parent2.__init__
# Parent1.__init__
# Child.__init__注意这里的输出顺序,
Grandparent
Parent2
Parent1
Child
Child -> Parent1 -> Parent2 -> Grandparent
Child
super().__init__()
Parent1
__init__
Parent1
__init__
super().__init__()
super()
Child
Child
Parent1
Parent2
__init__
Parent2
__init__
super().__init__()
Grandparent
__init__
__init__
super()
要理解
super()
类名.__mro__
help(类名)
super()
考虑一个典型的“菱形继承”问题:
class A:
def greet(self):
print("Hello from A")
class B(A):
def greet(self):
super().greet() # 调用A.greet
print("Hello from B")
class C(A):
def greet(self):
super().greet() # 调用A.greet
print("Hello from C")
class D(B, C): # D继承B和C
def greet(self):
super().greet() # 按照D的MRO调用
print("Hello from D")
d = D()
d.greet()我们来看看
D
D -> B -> C -> A -> object
d.greet()
d.greet()
super().greet()
super()
D
D
B
B.greet()
B.greet()
super().greet()
super()
D
super()
D
B
C
C.greet()
C.greet()
super().greet()
super()
D
C
A
A.greet()
A.greet()
super().greet()
super()
D
A
object
object
greet
最终输出会是:
Hello from A Hello from C Hello from B Hello from D
这个例子清楚地展示了
super()
A.greet()
super()
d.greet()
B.greet()
C.greet()
B.greet()
C.greet()
A.greet()
A.greet()
super()
super()
super()
在Python 2中,
super()
# Python 2 示例
class Parent:
def __init__(self, name):
self.name = name
print("Parent init:", self.name)
class Child(Parent):
def __init__(self, name, age):
super(Child, self).__init__(name) # 必须传入Child和self
self.age = age
print("Child init:", self.age)
# c = Child("Alice", 10)这种显式传入
Child
self
self
到了Python 3,
super()
# Python 3 示例
class Parent:
def __init__(self, name):
self.name = name
print("Parent init:", self.name)
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # 无需传入任何参数
self.age = age
print("Child init:", self.age)
c = Child("Alice", 10)
# 输出:
# Parent init: Alice
# Child init: 10在Python 3中,
super()
super()
这种演变体现了Python语言设计哲学中追求“显式优于隐式,但简单情况允许隐式”的平衡。对于
super()
super()
super()
掌握
super()
super()
避免硬编码,增强代码灵活性: 不使用
super()
ParentClassName.__init__(self, ...)
Child
Parent
Intermediate
super()
super()
促进模块化和协作式继承: 在多重继承或Mixin模式中,不同的父类可能各自实现了一部分功能,它们需要协同工作。
super()
super()
super()
super()
防止重复执行和逻辑错误: 在没有
super()
__init__
super()
更好的代码可读性和意图表达:
super().__init__()
ParentClassName.__init__(self)
总的来说,
super()
以上就是python中super()函数有什么作用?的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号