規則:
根據類的繼承關係樹,自底向上,自左向右搜尋,直到找到第乙個屬性為止。(如果未找到,丟擲異常)
來自:《learning python 5th edition》一書figure 26-1
從python的搜尋路徑來看:
①子類定義了與父類相同的屬性,那麼通過物件訪問的方式,子類將覆蓋父類的屬性;
②存在多繼承且各父類中存在相同的屬性(圖中的c2和c3的z)時,「左邊」的父類將覆蓋「右邊」的父類。
**舉例:
class c2(object):
def __init__(self):
self.x = 10
self.z = 20
class c3(object):
def __init__(self):
self.w = 15
self.z = 25
class c1(c2, c3):
def __init__(self):
c3.__init__(self)
c2.__init__(self)
self.x = 12
self.y = 13
if __name__ == "__main__":
i1 = c1()
i1.m = 33
print("i1.m", i1.m)
print("i1.x", i1.x)
print("i1.y", i1.y)
print("i1.z", i1.z)
print("i1.w", i1.w)
輸出結果:
i1.m 33
i1.x 12
i1.y 13
i1.z20
i1.w 15
疑問:
1.如果將
c3.__init__(self)和
c2.__init__(self)兩行語句交換
,則輸出結果:
i1.m 33
i1.x 12
i1.y 13
i1.z25
i1.w 15
猜想:這兩行語句決定了多繼承中,父類中的「左」和「右」?該如何理解?
2.如果將
c3.__init__(self)和
c2.__init__(self)兩行語句刪除
,將會報告如下錯誤:
attributeerror: 'c1' object has no attribute 'z'
猜想:這兩行語句決定了子類是否繼承父類中的屬性?
Python之旅 帶著決心出發(第10步)
一 基礎篇 在類例項方法定義中,第乙個引數為self,可認為是例項物件本身,類似於c 中的this指標。兩種等價的呼叫方式 1.obj.obj method 2.methodcall.obj method obj 注 類方法和類的靜態方法不支援第二種呼叫方式,但支援第一種呼叫方式。舉例 class ...
python課程作業 第9章 類
使用者 def init self,first name,last name 初始化姓名 self.first name first name.title self.last name last name.title defdescribe user self 輸出姓名 print this is ...
《笨辦法學Python》 第9課手記
這節課終於有一點新內容了,新內容也蠻容易理解的。原 如下 here s some new stuff,remember type it exactly.days mon tue wed thu fri sat sun months jan nfeb nmar napr nmay njune njul...