Python 没有执行 init

在 Python 中,我们经常会看到一些类的定义中包含了 __init__ 方法,这个方法被用来初始化对象的属性。但是有时候我们会发现,当我们创建对象的时候,__init__ 方法并没有被执行。这可能会让人感到困惑,究竟是为什么呢?

为什么会出现 init 方法没有执行的情况?

首先,我们需要明白 Python 中的 __init__ 方法是用来初始化对象的,当我们使用 ClassName() 来创建对象的时候,Python 会自动调用 __init__ 方法。但是,在某些情况下,我们可能会看到 __init__ 方法没有被执行的情况。其中最常见的原因是因为我们没有正确地调用父类的 __init__ 方法。

在 Python 中,如果一个类继承自另一个类,那么在子类的 __init__ 方法中应当调用父类的 __init__ 方法,以确保父类的属性被正确地初始化。如果我们忘记调用父类的 __init__ 方法,那么子类的属性就不会被正确地初始化,这就会导致 __init__ 方法没有被执行。

示例代码

让我们来看一个简单的示例代码来说明这个问题:

class Parent:
    def __init__(self):
        self.parent_attribute = "I am the parent"

class Child(Parent):
    def __init__(self):
        self.child_attribute = "I am the child"

child = Child()
print(child.child_attribute)
print(child.parent_attribute)  # 这里会报错

在这段代码中,Child 类继承自 Parent 类,但是在 Child 类的 __init__ 方法中没有调用 Parent 类的 __init__ 方法。因此,当我们创建 Child 类的对象时,Parent 类的 __init__ 方法并没有被执行,导致 parent_attribute 属性未被初始化,从而造成错误。

要解决这个问题,我们只需要在 Child 类的 __init__ 方法中调用 Parent 类的 __init__ 方法即可:

class Parent:
    def __init__(self):
        self.parent_attribute = "I am the parent"

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.child_attribute = "I am the child"

child = Child()
print(child.child_attribute)
print(child.parent_attribute)  # 现在不会报错了

在这个修正后的代码中,我们使用了 super().__init__() 来调用父类 Parent__init__ 方法,确保了父类的属性被正确地初始化。

饼状图示例

让我们来看一个用饼状图表示的例子,展示一个班级中男女比例的情况:

pie
    title 班级男女比例
    "男生" : 40
    "女生" : 60

通过这个饼状图,我们可以清楚地看到班级中男女生的比例分布情况。

状态图示例

除了饼状图,我们还可以用状态图来表示对象的状态转换情况。例如,我们可以用状态图来描述一个订单的生命周期:

stateDiagram
    [*] --> 待支付
    待支付 --> 已支付: 支付订单
    已支付 --> 已发货: 发货
    已发货 --> 已完成: 完成订单
    已完成 --> [*]: 关闭订单

通过这个状态图,我们可以清楚地看到订单在不同状态之间的转换情况,有助于我们更好地理解订单的生命周期。

结论

在 Python 中,当我们发现 __init__ 方法没有被执行时,通常是因为我们忘记调用父类的 __init__ 方法。通过正确地调用父类的 __init__ 方法,我们可以确保对象的属性被正确地初始化,避免出现意外的错误。同时,我们也可以利用饼状图和状态图等工具来更直观地展示数据