文章目录
- Python 继承示例:有与无 `super().__init__()` 的区别
- 父类(Parent)
- 子类(Child)不调用 `super().__init__()`
- 子类(Child)调用 `super().__init__()`
Python 继承示例:有与无 super().__init__()
的区别
好的,我将通过一个简单的例子来展示 super().__init__()
的作用。我们将创建两个类:Parent
作为父类,Child
作为继承自 Parent
的子类。每个类都有一个属性和一个方法,并且我们将看看在子类中是否调用 super().__init__()
的区别。
父类(Parent)
class Parent:def __init__(self):self.parent_attr = "I am from Parent"def parent_method(self):print("This is a method from Parent")
子类(Child)不调用 super().__init__()
class Child(Parent):def __init__(self):# super().__init__() 这行被注释掉了self.child_attr = "I am from Child"def child_method(self):print("This is a method from Child")# 创建子类实例并尝试访问父类的属性和方法
child_instance = Child()
print(child_instance.child_attr) # 输出: I am from Child
child_instance.child_method() # 输出: This is a method from Childtry:print(child_instance.parent_attr) # 将会引发 AttributeError
except AttributeError as e:print(f"Error: {e}") # 输出: Error: 'Child' object has no attribute 'parent_attr'try:child_instance.parent_method() # 将会引发 AttributeError
except AttributeError as e:print(f"Error: {e}") # 输出: Error: 'Child' object has no attribute 'parent_method'
在这个例子中,因为没有调用 super().__init__()
,所以 child_instance
实例不会初始化来自 Parent
类的 parent_attr
属性,也不会定义 parent_method
方法。因此,当尝试访问这些成员时,会抛出 AttributeError
异常。
子类(Child)调用 super().__init__()
class Child(Parent):def __init__(self):super().__init__() # 调用了父类的构造函数self.child_attr = "I am from Child"def child_method(self):print("This is a method from Child")# 创建子类实例并尝试访问父类的属性和方法
child_instance = Child()
print(child_instance.child_attr) # 输出: I am from Child
child_instance.child_method() # 输出: This is a method from Child
print(child_instance.parent_attr) # 输出: I am from Parent
child_instance.parent_method() # 输出: This is a method from Parent
在这个版本中,Child
类正确地调用了 Parent
类的构造函数,所以 child_instance
实例不仅有它自己的 child_attr
属性和 child_method
方法,而且还有从 Parent
类继承来的 parent_attr
属性和 parent_method
方法。这样,你可以成功地访问所有这些成员,而不会遇到任何错误。
这个例子展示了为什么在子类中调用 super().__init__()
是很重要的,因为它确保了父类的所有初始化逻辑都能被执行,从而保证对象能够正确地工作。