我之前在猿問上遇到了這么個問題,也不知道答案,關注了幾天也沒人回復,希望明白的朋友幫忙解答下,謝謝。問題如下:關于Python類的廣度和深度優(yōu)先問題?小白求教!class?A(object):????def?__init__(self):????????self.a?=?1????def?x(self):????????print?"A.x"????def?y(self):????????print?"A.y"????def?z(self):????????print?"A.z"?class?B(A):????def?__init__(self):????????A.__init__(self)????????self.a?=?2????????self.b?=?3????def?y(self):????????print?"B.y"????def?z(self):????????print?"B.z"?class?C(object):????def?__init__(self):????????self.a?=?4????????self.c?=?5????def?y(self):????????print?"C.y"????def?z(self):????????print?"C.z"?class?D(C,B):????def?__init__(self):????????C.__init__(self)????????B.__init__(self)????????self.d?=?6????def?z(self):????????print?"D.z"obj?=?D()print?obj.aobj.y()這個代碼class D(C,B)中的B和C調換位置obj.a?print出來永遠是2,而obj.y()會隨著位置調換改變輸出值感覺這既不符合深度優(yōu)先也不符合廣度優(yōu)先?這是什么鬼??
1 回答
已采納

慕九州1216299
TA貢獻5條經(jīng)驗 獲得超2個贊
obj.a屬性值不會隨著D的繼承順序改變是因為你這__init__()方法中先調用了C的init方法,再調用了B的init方法,所以總是按照B的init方法中將a屬性設置為2(self.a = 2);
再說這個obj.y()方法輸出會變化的問題。與屬性不同,這個y是方法,由于D繼承自C和B,調用D的y()方法,D類沒有類方法,則在其父類中查找(查找順序請 print(obj.__class__.__mro__)),當C首先繼承后,就這C類中找到了y()方法,調用后不再往后查找。反之,D(B,C)在查找上面那個變量中的順序,則先找到的是B類中的y()方法。所以打印結果不同。
添加回答
舉報
0/150
提交
取消