未指定父类的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
相关产品推荐
相关产品推荐

