86.多继承
多继承:子类继承多个父类
class Master(object): def __init__(self): self.kongfu = "古法煎饼果子配方" # 实例变量,属性 def make_cake(self): # 实例方法,方法 print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) def dayandai(self): print("师傅的大烟袋..") class School(object): def __init__(self): self.kongfu = "现代煎饼果子配方" def make_cake(self): print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) def xiaoyandai(self): print("学校的小烟袋..") # class Prentice(School, Master): # 多继承,继承了多个父类(School在前) # pass # damao = Prentice() # print(damao.kongfu) # damao.make_cake() # damao.dayandai() # damao.xiaoyandai() class Prentice(Master, School): # 多继承,继承了多个父类(Master在前) pass damao = Prentice() print(damao.kongfu) # 执行Master的属性 damao.make_cake() # 执行Master的实例方法 # 子类的魔法属性__mro__决定了属性和方法的查找顺序 print(Prentice.__mro__) damao.dayandai() # 不重名不受影响 damao.xiaoyandai()
说明:
- 多继承可以继承多个父类,也继承了所有父类的属性和方法
- 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
- 多个父类中,不重名的属性和方法,不会有任何影响。
剧情发展:
大猫掌握了 师傅的配方 和 学校的配方,通过研究,大猫在两个配方的基础上,创建了一种全新的煎饼果子配方,称之为 "猫氏煎饼果子配方"。(子类重写父类同名属性和方法)
例子:
# 古法师傅类 class Master(object): def __init__(self): print("Master") # 配方 self.kongfu = "古法配方" # 制作煎饼果子 def make_cake(self): print("按照<%s>制作煎饼果子" % self.kongfu) # 大烟袋 def dayandai(self): print("大烟袋") # 现代师傅类 class School(object): def __init__(self): print("School") # 配方 self.kongfu = "现代配方" # 制作煎饼果子 def make_cake(self): print("按照<%s>制作煎饼果子" % self.kongfu) # 小烟袋 def xiaoyandai(self): print("小烟袋") # 自定义一个徒弟类 class Prentice(Master, School): pass # 自定义一个徒弟 dm = Prentice() print(dm.kongfu) dm.make_cake() dm.dayandai() dm.xiaoyandai() """ 如果子类继承了多个父类 称之为多继承 格式: class 子类名(父类名1, 父类名2, ...): 或者: class 派生类名(基类名1, 基类名2, ...): 如果子类继承了多个父类 --- 方法 - 如果多个父类的方法名相同(__init__, make_cake) 子类会继承第一个父类 - 如果多个父类的方法名不同(dayandai, xiaoyandai) 子类会全部继承 ----属性 - 为什么会继承第一个父类的属性? - 是因为子类继承了第一个父类的init方法 """