Python3中子类没有显式调用父类的__init__方法会如何?

看了很多材料都提到子类应该要显式地调用父类的__init__方法,
但是如果子类有__init__方法,且并未显式调用父类的__init__方法也不会报错啊,所以是否可以不必显式调用呢?
Python3中子类没有显式调用父类的__init__方法会如何?

4 回复

这样父类成员就不会初始化,调用会直接报错


如果子类没有显式调用父类的 __init__ 方法,那么父类的初始化代码就不会执行。这通常意味着父类中定义的实例属性不会被设置,可能会导致子类实例缺少必要的属性或状态,从而引发 AttributeError 或其他意外行为。

举个例子:

class Parent:
    def __init__(self):
        self.value = 42
        print("Parent __init__ called")

class Child(Parent):
    def __init__(self):
        # 没有调用 super().__init__()
        print("Child __init__ called")

c = Child()
print(c.value)  # 这里会抛出 AttributeError: 'Child' object has no attribute 'value'

要修复这个问题,你需要在子类的 __init__ 方法中显式调用 super().__init__()

class Child(Parent):
    def __init__(self):
        super().__init__()  # 正确调用父类初始化
        print("Child __init__ called")

c = Child()
print(c.value)  # 现在可以正常输出 42

简单说就是:记得用 super().__init__() 来确保父类正确初始化。

如何父类有多个子类,有一个子类显式调用了父类的__init__方法,但是其余子类并没有,这样会导致什么问题?

假如父类在__init__的方法创建成员变量 A, 子类如果调用了父类的__init__方法那么子类的实例就有成员变量 A,如果子类没有调用,那么该子类的实例就没有这个成员变量。 如果其他方法要使用这个成员变量 A, 那么自然就要报错。

回到顶部