子类调用父类的同名方法和属性: 把父类的同名属性和方法再次封装
注意:
- 定义同名方法前需要再次调用初始化自己所属属性 __init__(self)
- 父系方法的语法:父系类名.同名方法(self)
class AAA: # AAA父类
def __init__(self):
self.kongfu = ('AAA古法')
def make_cake(self):
print(f'老师傅使用 {self.kongfu}')
class BBB: # BBB父类
def __init__(self):
self.kongfu = ('BBB现在工艺')
def make_cake(self):
print(f'学校使用 {self.kongfu}')
# 子类,继承AAA和BBB父类,并且有同名方法
class PPP(BBB, AAA):
def __init__(self):
self.kongfu = '个性化创意'
def make_cake(self): # 与父类同名方法
# 当要调用子类方法时,这里必须先调用初始化自己的__init__属性,否则属性是上次结果属性
PPP.__init__(self) # 也可以写成 self.__init__()
print(f'自己使用 {self.kongfu}')
def AAA_make_cake(self): # 调用 父类 的同名方法, 父类名.父类同名方法名(self)
# 再次调用初始化的原因:
# 这里想要调用父类的同名方法和属性。属性在init初始化位置,所以需要再次调用init
AAA.__init__(self) # 一定要加(self)形参,否则报错
AAA.make_cake(self) # 父类名.父类的同名实例方法
def BBB_make_cake(self): # 调用 父类 的同名方法, 父类名.父类同名方法名(self)
# 再次调用初始化的原因:
# 这里想要调用父类的同名方法和属性。属性在init初始化位置,所以需要再次调用init
BBB.__init__(self) # 一定要加(self)形参,否则报错
BBB.make_cake(self) # 父类名.父类的同名实例方法
s1 = PPP()
s1.AAA_make_cake() # 执行 AAA 父类同名方法
s1.make_cake() # 执行 PPP 子类同名方法
s1.BBB_make_cake() # 执行 BBB 父类同名方法
执行结果:
使用super() 函数:用于调用父类的一个方法。根据__mro__顺序调用上一级, 比较适合单继承。
语法:
super(当前类名,self).方法实例() 有参数写法
super().方法实例() 无参数写法
class Master:
def __init__(self):
self.kongfu = '古法技术'
def make_cake(self):
print(f'使用 {self.kongfu}')
class School(Master):
def __init__(self):
self.kongfu = '现代技术'
def make_cake(self):
print(f'使用 {self.kongfu}')
# 加入super()带参数写法 super(当前类名,self).实例方法()
super(School, self).__init__() # 继承School的父类(Master类)
super(School, self).make_cake()
class Stu(School):
def __init__(self):
self.kongfu = '独创技术'
def make_cake(self):
self.__init__()
print(f'使用 {self.kongfu}')
def old1_make_cake(self):
# 无参数super super().方法实例() 自动查找当前父类
super().__init__() # 继承当前Stu的父类 School
super().make_cake()
print(Stu.__mro__) # stu 继承 School, School 继承 Master, Master是顶层。
tony = Stu()
tony.old1_make_cake()