网站首页 > 基础教程 正文
super()是Python面向对象编程中一个非常重要的内置函数,它用于调用父类(超类)的方法。下面我将全面详细地讲解super()函数的用法和原理。
一、基本概念
1. 作用
super()返回一个代理对象,它会将方法调用委托给父类或兄弟类。主要用于:
- 访问被重写的父类方法
- 实现多重继承中的方法调用
- 避免硬编码父类名称
2. 基本语法
super([type[, object-or-type]])
- 在Python 3中,通常可以简化为super()
- 在类方法中也可以使用super()
二、常见使用场景
1. 调用父类的初始化方法
class Parent:
def __init__(self, name):
self.name = name
print("Parent __init__ called")
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # 调用父类的__init__
self.age = age
print("Child __init__ called")
c = Child("Alice", 10)
# 输出:
# Parent __init__ called
# Child __init__ called
2. 调用父类的普通方法
class Parent:
def show(self):
print("Parent show method")
class Child(Parent):
def show(self):
super().show() # 调用父类的show方法
print("Child show method")
c = Child()
c.show()
# 输出:
# Parent show method
# Child show method
三、super()的工作原理
1. 方法解析顺序(MRO)
Python使用C3线性化算法确定方法调用顺序,存储在__mro__属性中
class A:
def method(self):
print("A method")
class B(A):
def method(self):
print("B method")
class C(A):
def method(self):
print("C method")
class D(B, C):
def method(self):
super().method() # 根据MRO调用
print(D.__mro__)
# 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
d = D()
d.method() # 输出: B method (按照MRO顺序)
2. super()的两种形式
(1) 绑定形式 (在实例方法中使用)
super().method(args)
等价于
super(current_class, self).method(args)
(2) 非绑定形式 (在类方法或外部使用)
super(Class, obj).method(args)
四、在类方法中使用super()
class A:
@classmethod
def class_method(cls):
print(f"A class_method, cls={cls.__name__}")
class B(A):
@classmethod
def class_method(cls):
super().class_method() # 等同于 super(B, cls).class_method()
print(f"B class_method, cls={cls.__name__}")
B.class_method()
# 输出:
# A class_method, cls=B
# B class_method, cls=B
五、多重继承中的super()
class A:
def method(self):
print("A method")
class B(A):
def method(self):
print("B method start")
super().method()
print("B method end")
class C(A):
def method(self):
print("C method start")
super().method()
print("C method end")
class D(B, C):
def method(self):
print("D method start")
super().method()
print("D method end")
d = D()
d.method()
print(D.__mro__)
输出结果:
D method start
B method start
C method start
A method
C method end
B method end
D method end
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
六、super()的常见误区
1. 不要滥用super()
class A:
def __init__(self):
print("A init")
class B(A):
def __init__(self):
print("B init")
super().__init__()
class C(A):
def __init__(self):
print("C init")
super().__init__()
class D(B, C):
def __init__(self):
print("D init")
super().__init__()
d = D()
# 输出:
# D init
# B init
# C init
# A init
2. 不要混淆super()和直接调用父类
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
A.method(self) # 直接调用父类,不是super()
class C(A):
def method(self):
print("C")
super().method()
class D(B, C):
def method(self):
print("D")
super().method()
d = D()
d.method()
print(D.__mro__)
D
B
A
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
七、实际应用示例
1. 扩展内置类
class LoggingList(list):
def append(self, item):
print(f"Appending {item}")
super().append(item)
lst = LoggingList()
lst.append(1) # 输出: Appending 1
lst.append(2) # 输出: Appending 2
print(lst) # 输出: [1, 2]
2. 实现协作式多重继承
class Animal:
def __init__(self, name, **kwargs):
self.name = name
super().__init__(**kwargs)
class CanFly:
def __init__(self, wingspan, **kwargs):
self.wingspan = wingspan
super().__init__(**kwargs)
def fly(self):
print(f"{self.name} is flying with {self.wingspan}m wingspan")
class CanSwim:
def __init__(self, swim_speed, **kwargs):
self.swim_speed = swim_speed
super().__init__(**kwargs)
def swim(self):
print(f"{self.name} is swimming at {self.swim_speed} knots")
class Duck(Animal, CanFly, CanSwim):
def __init__(self, name, wingspan, swim_speed):
super().__init__(name=name, wingspan=wingspan, swim_speed=swim_speed)
duck = Duck("Donald", 1.5, 2)
duck.fly() # Donald is flying with 1.5m wingspan
duck.swim() # Donald is swimming at 2 knots
总结
- super()用于调用父类方法,特别是在多重继承中
- 它遵循方法解析顺序(MRO)
- 在Python 3中,通常可以简化为super()
- 在多重继承中,super()实现了协作式方法调用
- 不要滥用super(),理解其调用顺序很重要
正确使用super()可以使你的面向对象代码更加灵活、可维护,特别是在复杂的继承结构中。
猜你喜欢
- 2025-06-12 Python super()函数:调用父类的构造方法
- 2025-06-12 Python语言高级实战-内置函数super()的使用之类的多继承
- 2025-06-12 Python 基础知识:什么是 super()?
- 2025-06-12 理解Python中super()与init()方法的使用
- 2024-07-26 Python兼职接单防骗术#Python学习
- 2024-07-26 Python-理解Python中的变量 Python-理解Python中的变量
- 2024-07-26 Python中列表元素的排序操作 #python爬虫
- 2024-07-26 Python中格式化字符串的三种方式(python中格式化字符串)
- 2024-07-26 Python中第三方库的卸载 Python中第三方库的卸载 #python编程
- 2024-07-26 Python自动化办公-在多个工作簿的同名工作表中追加行
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)