2017-09-05 118 views
0
class A(object): 
    def __init__(self): 
     self.a = 1 

class B(A): 
    def __init__(self): 
     A.__init__(self) 
     self.a = 2 
     self.b = 3 


class C(object): 
    def __init__(self): 
     self.a = 4 
     self.c = 5 

class D(C, B): 
    def __init__(self): 
     C.__init__(self) 
     B.__init__(self) 
     self.d = 6 

obj = D() 
print(obj.a) 

我的理解是,python將首先搜索類C然後B然後A得到一個。因此print(obj.a)在搜索類C時會打印出4。但是答案是2.這意味着Python從類B獲得self.a = 2而不是self.a = 4從類C.任何人都可以解釋原因是什麼?謝謝蟒蛇3類繼承問題

+3

您明確*在'C .__ init__'後面調用'B .__ init__'。您應該使用'super'來管理多重繼承,並閱讀MRO(方法解析順序)以查看調用超級方法實現的順序。 – jonrsharpe

+0

您手動調用父'__init__'方法;由於'B .__ init __()'最後被調用,因此最後執行'self.a = 2'(在調用'A .__ init __()'之後)。 –

回答

1

這裏沒有搜索。您正在直接調用未綁定的方法,手動傳入self。這些是簡單函數調用,僅此而已。

所以這只是一個追溯執行順序的問題:

D() -> D.__init__(self) 
    C.__init__(self) 
     self.a = 4 
    B.__init__(self) 
     A.__init__(self) 
      self.a = 1 
     self.a = 2 

所以a分配4,然後1,然後2