2016-09-15 110 views
5

這是一個老樣式類:從對象中繼承類定義類型爲元類嗎?

class OldStyle: 
    pass 

這是一種新式類:

class NewStyle(object): 
    pass 

這也是一個新式類:

class NewStyle2: 
    __metaclass__ = type 

NewStyleNewStyle2之間有什麼不同?

我的印象是,從object繼承的唯一影響實際上是定義了type元類,但我找不到任何確認,除此之外我沒有看到任何區別。

回答

2

很多是的,NewStyleNewStyle2之間沒有區別。兩者都是type類型,而OldStyle類型爲classobj

如果您從對象中繼承,則使用__class__ of object (meaning type) is going;如果您提供__metaclass__ that is going to get picked up

如果沒有提供任何內容作爲__metaclass__,並且您沒有從object,Py_ClassType is assigned as the metaclass繼承。

在所有情況下,metaclass.__new__都會被調用。對於Py_ClassType.__new__它遵循定義的語義(我從來沒有檢查過它們,真的)和type.__new__ it makes sure to pack object在你的班級的基礎。

當然,類似的效果是通過實現:

cls = type("NewStyle3",(), {}) 

其中呼叫被立即type製成;這只是一個更大的麻煩:-)