You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未指定父类的Python类中为何使用super().__init__(*args,**kwargs)?

关于Python中无显式父类的类与super()的作用解析

嘿,这个问题问得非常关键!咱们来把这个点掰扯明白:

1. 无显式父类的类,默认父类是什么?

在Python 3里,所有没有显式声明父类的类,默认都会继承自object类——这是Python新式类的规则,现在已经不存在旧式类了。哪怕你写的是class Sneaky:,它和class Sneaky(object):完全等价,本质上都是object的子类。

2. 代码里的super()到底在调用谁的方法?

看你代码里的super().__init__(*args, **kwargs):

  • 当你在Sneaky类的__init__里调用super()时,它会根据当前类的**方法解析顺序(MRO)**找到下一个类,也就是object,所以实际调用的是object.__init__()。
  • 你可能会疑惑:object.__init__()本来就不需要额外参数,为啥还要传*args和**kwargs?这其实是为了多继承场景做铺垫!比如后续如果你写一个同时继承Sneaky和Agile的类:
class Thief(Sneaky, Agile):
    def __init__(self, sneaky=True, agile=True, *args, **kwargs):
        super().__init__(sneaky=sneaky, agile=agile, *args, **kwargs)

这时候Sneaky的__init__里的super()就会指向MRO链里的下一个类Agile,而不是直接到object,Agile的super()再指向object,这样整个初始化链就能正确传递参数,不会漏掉任何父类的初始化逻辑——这正是super()在多继承里的核心价值:灵活适配MRO,而不是硬编码父类。

3. 代码里的小细节修正

哦对了,你写的def evade(self): return self.agile and random.randint(0, 1)这里少了个闭合的括号,应该改成return self.agile and random.randint(0, 1),不然代码会报错哦~

内容的提问来源于stack exchange,提问作者kobs20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:11:25