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

2022-09-08 23:30:27 字數 2802 閱讀 6897

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

C 和JAVA中子類父類同名方法呼叫的結果

子類的函式a中呼叫父類的函式b,函式b中呼叫函式c,子類中存在函式c的覆寫函式d,此時父類的方法會去呼叫子類的實現d。將總結放在最前面來說明本文的主旨 多型 建議先讀後面兩部分再讀總結 對於子類來講,在子類的方法中呼叫父類的方法methoda,父類的方法中呼叫了子父類同名的方法,這時methoda本...

C 子類和父類同名成員變數或函式

在c 中子類和父類同名成員時候c 版本不同處理的方式也不同。下面是我使用visual c 2015 update 3的測試結果 測試 如下 include using namespace std class base virtual void print base class public base...

子類函式對父類同名函式的覆蓋

先看一道題 class b void f double const class d public b int main 答案 3個呼叫全部呼叫子類的f void 但由於後兩個不能轉換為void 編譯出錯。void 是可以指向任何型別的指標。c 中,只有int 0可以轉換為指標型,其餘均不可以,所以出...