2014-02-24 43 views
0

我是python編程的新手, 下面是父類子類的例子,有兩個直接的超類(即base)的C:A和B. ,所以人們自然會認爲C的超類是A.但是,A從T繼承它的屬性a的值爲a = 0:如果super(C,c)返回C的超類,那麼super(C,c ).a會返回0,但它不會?super()在python編程中實現

能否請你幫我理解爲什麼它返回2.爲什麼不爲0

>>> class T(object): 
...  a = 0 
>>> class A(T): 
...  pass 
>>> class B(T): 
...  a = 2 
>>> class C(A,B): 
...  pass 
>>> c = C() 
>>>super(C,c).a 
2 

感謝, 喝罵

回答

0

它與Python 方法解析順序,或MRO做。 Python的MRO的確切定義如下:Python 2.3's MRO doc。編輯:this explanation by Guido seems easier to read,它包含一個與您的完全相同的示例。

如果您在課堂上致電__mro__,您將看到它查找內容的順序。在這種情況下:

>>> C.__mro__ 
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.T'>, <type 'object'>) 

所以你可以看到,它首先進入B,然後才T的原因是,它原本是不可能在這個結構覆蓋B中在T屬性,這不可能是期望的行爲。

就我個人而言,我總是避免使用這種鑽石風格的繼承模式,當然除了object這是每個其他類的基類。