Python中super(Chicken, self)和super(Chicken, cls)的区别是什么?
如题 Python 里 super(Chicken, self) super(Chicken, cls) 的区别,
Python中super(Chicken, self)和super(Chicken, cls)的区别是什么?
3 回复
在Python中,super(Chicken, self) 和 super(Chicken, cls) 的核心区别在于第一个参数的类型,这决定了 super() 的用途场景。
1. super(Chicken, self)
这是在实例方法中使用的标准形式。self 是当前类的实例。super(Chicken, self) 返回一个代理对象,它会根据 self 实例的 MRO (方法解析顺序) 来查找 Chicken 类的下一个父类。然后,你可以通过这个代理对象调用父类的方法。
class Bird:
def fly(self):
print("Bird flying")
class Chicken(Bird):
def fly(self):
# 调用父类Bird的fly方法
super(Chicken, self).fly()
print("Chicken fluttering")
c = Chicken()
c.fly()
# 输出:
# Bird flying
# Chicken fluttering
2. super(Chicken, cls)
这是在类方法 (@classmethod) 中使用的形式。cls 是当前类本身(在这里就是 Chicken 类)。super(Chicken, cls) 返回一个代理对象,它会根据 cls 类的 MRO 来查找 Chicken 类的下一个父类。主要用于调用父类的类方法。
class Bird:
@classmethod
def species_info(cls):
print(f"Species info from {cls.__name__}")
class Chicken(Bird):
@classmethod
def species_info(cls):
# 调用父类Bird的species_info类方法
super(Chicken, cls).species_info()
print(f"Additional info from {cls.__name__}")
Chicken.species_info()
# 输出:
# Species info from Chicken # 注意,这里的cls仍然是Chicken,体现了类方法的特性
# Additional info from Chicken
关键总结:
super(Chicken, self):用于实例方法,基于实例self的 MRO 查找并调用父类的实例方法。super(Chicken, cls):用于类方法,基于类cls的 MRO 查找并调用父类的类方法。
简单建议: 在实例方法里用 super(Chicken, self),在类方法里用 super(Chicken, cls)。
这个看你传递的是什么
可能这篇文章能帮到你,Super 返回的是 mro 列表中的下一个类
https://blog.yasking.org/a/python-super.html
首先谢谢!类和实例的 mro 都一样的吗?

