super()的使用
問題:
class Master(object):
def __init__(self):
self.kongfu = "古法煎餅果子配方" # 實體變數,屬性
def make_cake(self): # 實體方法,方法
print("[古法] 按照 <%s> 制作了一份煎餅果子..." % self.kongfu)
# 父類是 Master類
class School(Master):
def __init__(self):
self.kongfu = "現代煎餅果子配方"
def make_cake(self):
print("[現代] 按照 <%s> 制作了一份煎餅果子..." % self.kongfu)
super().__init__() # 執行父類的構造方法
super().make_cake() # 執行父類的實體方法
# 父類是 School 和 Master
class Prentice(School, Master): # 多繼承,繼承了多個父類
def __init__(self):
self.kongfu = "貓氏煎餅果子配方"
def make_cake(self):
self.__init__() # 執行本類的__init__方法,做屬性初始化 self.kongfu = "貓氏...."
print("[貓氏] 按照 <%s> 制作了一份煎餅果子..." % self.kongfu)
def make_all_cake(self):
# 方式1. 指定執行父類的方法(代碼臃腫)
# School.__init__(self)
# School.make_cake(self)
#
# Master.__init__(self)
# Master.make_cake(self)
#
# self.__init__()
# self.make_cake()
# 方法2. super() 帶引數版本,只支持新式類
# super(Prentice, self).__init__() # 執行父類的 __init__方法
# super(Prentice, self).make_cake()
# self.make_cake()
# 方法3. super()的簡化版,只支持新式類
super().__init__() # 執行父類的 __init__方法
super().make_cake() # 執行父類的 實體方法
self.make_cake() # 執行本類的實體方法
damao = Prentice()
damao.make_cake()
damao.make_all_cake()
# print(Prentice.__mro__)
知識點:
子類繼承了多個父類,如果父類類名修改了,那么子類也要涉及多次修改,而且需要重復寫多次呼叫,顯得代碼臃腫,
使用super() 可以逐一呼叫所有的父類方法,并且只執行一次,呼叫順序遵循 mro 類屬性的順序,
注意:如果繼承了多個父類,且父類都有同名方法,則默認只執行第一個父類的(同名方法只執行一次,目前super()不支持執行多個父類的同名方法)
super() 在Python2.3之后才有的機制,用于通常單繼承的多層繼承,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39713.html
標籤:Python
上一篇:PHP設計模式之橋梁模式(Bridge)代碼實體大全(11)
下一篇:面向物件-多層繼承
