Python中的super().__init__()和显式超类__init__()都用于调用父类的构造函数,但它们之间存在一些行为差异。在本文中,我们将探讨这些差异,并通过案例代码来说明它们的使用方式。
### super().__init__()的行为super().__init__()是Python中用于调用父类构造函数的一种常用方式。它会自动查找当前类的父类,并调用父类的构造函数。这种方式可以简化代码,并且在继承链中的多个父类时非常有用。让我们通过一个例子来说明super().__init__()的行为。pythonclass Parent: def __init__(self, name): self.name = nameclass Child(Parent): def __init__(self, name, age): super().__init__(name) self.age = agechild = Child("Alice", 10)print(child.name) # 输出 "Alice"print(child.age) # 输出 10在上面的例子中,Parent类有一个构造函数__init__(),它接受一个参数name,并将其赋值给实例变量self.name。Child类继承自Parent类,并有自己的构造函数__init__(),它接受两个参数name和age。在Child类的构造函数中,我们使用super().__init__(name)来调用父类Parent的构造函数,将name参数传递给它。然后,我们在Child类的构造函数中定义了一个新的实例变量self.age,并将age参数赋值给它。通过运行上面的代码,我们可以看到Child类的实例child成功地调用了父类Parent的构造函数,并且正常地初始化了实例变量name和age。### 显式超类__init__()的行为显式超类__init__()是另一种调用父类构造函数的方式。它需要显式地指定要调用的父类,并传递相应的参数。这种方式在某些情况下可能更加灵活,因为它允许我们选择性地调用特定的父类构造函数。让我们通过修改上面的例子来说明显式超类__init__()的行为。pythonclass Parent: def __init__(self, name): self.name = nameclass Child(Parent): def __init__(self, name, age): Parent.__init__(self, name) self.age = agechild = Child("Bob", 15)print(child.name) # 输出 "Bob"print(child.age) # 输出 15在上面的例子中,我们在Child类的构造函数中使用Parent.__init__(self, name)来显式地调用父类Parent的构造函数。与super().__init__()不同,我们需要明确指定要调用的父类,并将self作为第一个参数传递给它。然后,我们在Child类的构造函数中定义了一个新的实例变量self.age,并将age参数赋值给它。通过运行上面的代码,我们可以看到Child类的实例child成功地调用了父类Parent的构造函数,并且正常地初始化了实例变量name和age。在本文中,我们探讨了Python中super().__init__()和显式超类__init__()之间的行为差异。super().__init__()可以自动查找当前类的父类,并调用父类的构造函数,而显式超类__init__()需要显式地指定要调用的父类,并传递相应的参数。这两种方式在继承链中的多个父类时都可以使用,但根据具体情况选择适合的方式会更加灵活。