Python之旅 帶著決心出發(第9步)

2021-08-20 15:05:37 字數 1412 閱讀 1101

規則:

根據類的繼承關係樹,自底向上,自左向右搜尋,直到找到第乙個屬性為止。(如果未找到,丟擲異常)

來自:《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...