Python基类中调用无参数super().__init__()的作用是什么?
基类里调用无参数
super().__init__()的实际作用 很多人会觉得继承自object的基类里写super().__init__()是多余的,但实际上这是Python3中super()的动态特性带来的预留设计,核心点在于:
super()不是固定指向父类,而是跟着实例的MRO走
Python3的无参数super()会根据**调用这个方法的实例的MRO(方法解析顺序)**来定位下一个要执行的类,而不是定义该方法的类的直接父类。举个实际场景:
# 定义一个基类,里面调用super().__init__ class Base: def __init__(self): print("Base初始化") super().__init__() # 另一个独立的基类 class OtherBase: def __init__(self): print("OtherBase初始化") # 多继承这两个类 class MyClass(Base, OtherBase): def __init__(self): print("MyClass初始化") super().__init__() # 实例化MyClass,输出顺序是: # MyClass初始化 # Base初始化 # OtherBase初始化
这里MyClass的MRO是[MyClass, Base, OtherBase, object],当Base.__init__里的super()被调用时,它找的是MRO中Base的下一个类OtherBase,而不是object——这就是这个调用的实际价值。
原作者这么写的原因
- 预留多继承扩展性:原作者可能一开始就考虑到这个基类未来会被用于多继承场景,提前写好
super()调用,避免后续需要修改基类代码来适配多继承。 - Python2迁移遗留:如果代码是从Python2迁过来的,Python2里
super必须传Base, self,迁移到Python3时改成无参数形式,保留了原有逻辑。
什么时候这个调用看起来“没用”?
如果这个基类从来不会被用于多继承,只是单独实例化,那super().__init__()确实只会调用object.__init__()——而object.__init__()本身没有任何业务逻辑,只是做最基础的对象初始化,这时看起来就像“没作用”。
内容的提问来源于stack exchange,提问作者bd2357
相关产品推荐
相关产品推荐

