2016-05-14 71 views
1

爲什麼元類沒有出現在MRO中?方法解析順序和元類

例如:

>>> class Foo(type): 
... foo = 21 
... 
>>> class Bar(metaclass=Foo): 
... pass 
... 
>>> Bar.mro() 
[<class '__main__.Bar'>, <class 'object'>] 
>>> Bar.foo 
21 

另外,我看到其他地方Python用C3線性計算MRO,但這種線性不處理元類。那麼Python在那種情況下使用什麼算法?

+1

你有沒有試過在Bar的實例上調用它?因爲那不起作用。並且不支持AFAIK元類和多繼承。然而,我現在對如何到達Foo感到不知所措。 – deets

回答

4

因爲您的類都沒有從元類派生。元類是不是基類。元類是生成的工廠Bar類對象,就像類對象生成實例一樣。

此處不需要線性化。 BarFoo類型的對象,就像其他類是type類型一樣。 Bar的任何子類將具有相同的類型(元類);他們有這種關係直接。一個類一次只能有一個元類。

元類在查找屬性時最後一個;所以Bar.spam將首先在MRO中尋找,並且只有然後type(Bar)上。

當然,元類也使用繼承層次結構; Foo源自您的示例中的type。這種關係也使用MRO。

+0

謝謝。我的第二個問題呢? –

+0

@ValentinLorentz:我認爲這已經回答了? –

+0

對不起,我發表評論後立即明白了。另外,你的編輯也會回答它。 –