1. 程式人生 > 實用技巧 >面向物件--子類呼叫父類同名屬性和方法

面向物件--子類呼叫父類同名屬性和方法

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引數,來控制方法和屬性的訪問修改。