个人理解:
super().__init__()的作用是在子类中继承父类的init方法。
验证过程:
通过对比三种不同的调用方法,反映super().__init__()的作用。
1、定义一个父类BaseClass:
"""
验证super().__init__()的作用
"""
# 定义一个父类BaseClass
class BaseClass():
def __init__(self,name="base"):
self.name=name
# 定义三个子类,继承自父类BaseClass
class A(BaseClass):
pass
class B(BaseClass):
def __init__(self,age):
self.age=age
class C(BaseClass):
def __init__(self,age):
self.age=age
super(C, self).__init__()
2、定义A、B、C三个继承自BaseClass的子类,并调用三个子类
(1)定义类A,完全继承父类BaseClass,打印父类的name属性:
# 定义子类A,继承父类BaseClass
class A(BaseClass):
pass
# 调用类B,打印继承自父类的name属性
A=A()
print(A.name)
代码执行结果:
base
(2)定义类B,继承BaseClass,编写init方法:
# 定义子类B,继承BaseClass,编写init方法
class B(BaseClass):
def __init__(self,age):
self.age=age
# 调用类B,打印新定义的age属性以及继承自父类的name属性
B=B(18)
print(B.age)
print(B.name)
代码执行结果:
18
Traceback (most recent call last):
File "C:/Users/PythonProject/exception.py", line 98, in <module>
print(B.name)
AttributeError: 'B' object has no attribute 'name'
此处代码报错,显示没有name属性。原因是:父类的name属性被新定义的age属性覆盖,所以只能打印出age属性,无法打印name属性。
(3)定义类C,继承BaseClass,编写init方法并添加了super().__init__():
# 定义子类C,继承父类BaseClass,重新编写新的init方法,并继承父类的init方法
class C(BaseClass):
def __init__(self,age):
self.age=age
super(C, self).__init__()
# 调用类C,打印新定义的age属性以及继承自父类的name属性
C=C(18)
print(C.age)
print(C.name)
代码执行结果:
18
base
此处代码未报错,可以正常打印出age和name属性。原因是:新定义的age属性覆盖继承自父类的name属性后,super().__init__()又继承了父类的name属性,所以age属性和name属性均可正常打印。
说明:本文只是作者在学习其他文章后做的总结笔记,仅供参考。