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 都一样的吗?

回到顶部