面向物件--子類呼叫父類同名屬性和方法
阿新 • • 發佈:2020-09-14
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("執行子類的__init__方法前,self.kongfu屬性:%s" % self.kongfu)
self.__init__() # 執行本類的__init__方法,做屬性初始化 self.kongfu = "貓氏...."
print("執行子類的__init__方法前,self.kongfu屬性:%s" % self.kongfu)
print("[貓氏] 按照 <%s> 製作了一份煎餅果子..." % self.kongfu)
# 呼叫父類方法格式:父類類名.父類方法(self)
def make_old_cake(self):
# 不推薦這樣訪問父類的例項屬性,相當於建立了一個新的父類物件
# print("直接呼叫Master類的kongfu屬性:%s" % Master().kongfu)
# 可以通過執行Master類的__init__方法,來修改self的屬性值
print("執行Master類的__init__方法前,self.kongfu屬性:%s" % self.kongfu)
Master.__init__(self) # 呼叫了父類Master的__init__方法 self.kongfu = "古法...."
print("執行Master類的__init__方法後,self.kongfu屬性:%s" % self.kongfu)
Master.make_cake(self) # 呼叫父類Master的例項方法
def make_new_cake(self):
# 不推薦這樣訪問類的例項屬性,相當於建立了一個新的父類物件
# print("直接呼叫School類的kongfu屬性:%s" % School().kongfu)
# 可以通過執行School類的__init__方法,來修改self的屬性值
print("執行School類的__init__方法前,self.kongfu屬性:%s" % self.kongfu)
School.__init__(self) # 呼叫了父類School的__init__方法 self.kongfu = "現代...."
print("執行School類的__init__方法後,self.kongfu屬性:%s" % self.kongfu)
School.make_cake(self) # 呼叫父類School的例項方法
# 例項化物件,自動執行子類的__init__方法
damao = Prentice()
damao.make_cake() # 呼叫子類的方法(預設重寫了父類的同名方法)
print("--" * 10)
damao.make_old_cake() # 進入例項方法去呼叫父類Master的方法
print("--" * 10)
damao.make_new_cake() # 進入例項方法去呼叫父類School的方法
print("--" * 10)
damao.make_cake() # 呼叫本類的例項方法
執行結果:
執行子類的__init__方法前,self.kongfu屬性:貓氏煎餅果子配方 執行子類的__init__方法前,self.kongfu屬性:貓氏煎餅果子配方 [貓氏] 按照 <貓氏煎餅果子配方> 製作了一份煎餅果子... -------------------- 執行Master類的__init__方法前,self.kongfu屬性:貓氏煎餅果子配方 執行Master類的__init__方法後,self.kongfu屬性:古法煎餅果子配方 [古法] 按照 <古法煎餅果子配方> 製作了一份煎餅果子... -------------------- 執行School類的__init__方法前,self.kongfu屬性:古法煎餅果子配方 執行School類的__init__方法後,self.kongfu屬性:現代煎餅果子配方 [現代] 按照 <現代煎餅果子配方> 製作了一份煎餅果子... -------------------- 執行子類的__init__方法前,self.kongfu屬性:現代煎餅果子配方 執行子類的__init__方法前,self.kongfu屬性:貓氏煎餅果子配方 [貓氏] 按照 <貓氏煎餅果子配方> 製作了一份煎餅果子...
核心點:
無論何時何地,self都表示是子類的物件。在呼叫父類方法時,通過傳遞self引數,來控制方法和屬性的訪問修改。