87.子类重写父类的同名属性和方法
子类重写父类的同名属性和方法
class Master(object): def __init__(self): self.kongfu = "古法煎饼果子配方" def make_cake(self): print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) class School(object): def __init__(self): self.kongfu = "现代煎饼果子配方" def make_cake(self): print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) class Prentice(School, Master): # 多继承,继承了多个父类 def __init__(self): self.kongfu = "猫氏煎饼果子配方" def make_cake(self): print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) # 如果子类和父类的方法名和属性名相同,则默认使用子类的 # 叫 子类重写父类的同名方法和属性 damao = Prentice() print(damao.kongfu) # 子类和父类有同名属性,则默认使用子类的 damao.make_cake() # 子类和父类有同名方法,则默认使用子类的 # 子类的魔法属性__mro__决定了属性和方法的查找顺序 print(Prentice.__mro__)
剧情发展:
大猫的新配方大受欢迎,但是有些顾客希望也能吃到古法配方和 现代配方 的煎饼果子...(子类调用父类的同名属性和方法)
# 古法师傅类 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): print("School") # 配方 self.kongfu = "现代配方" # 自定义 # 制作煎饼果子 def make_cake(self): print("按照<%s>制作煎饼果子" % self.kongfu) # 自定义 # 小烟袋 def xiaoyandai(self): print("小烟袋") # 自定义一个徒弟类 class Prentice(Master, School): # 重写 def __init__(self): # 配方 self.kongfu = "猫式配方" # 重写 # 制作煎饼果子 def make_cake(self): print("按照<%s>制作煎饼果子" % self.kongfu) # 徒弟 dm = Prentice() dm.dayandai() dm.xiaoyandai() print(dm.kongfu) dm.make_cake() # dm.test() # 继承链 # (<class '__main__.Prentice'>, <class '__main__.Master'>, <class '__main__.School'>, <class 'object'>) # 查看这个对象调用方法的的顺序 print(Prentice.__mro__) """ 如果子类继承了父类(无论单继承还是多继承) 假如父类的方法名和子类不同 - 子类会全部继承 假如父类的方法名和子类相同 - 子类会使用其自己类方法 为什么子类会调用自己本身的属性? - 子类先使用了自己本身的init方法 """