2013-07-31 128 views
1

我有點測試,以充分理解python中的元類。爲什麼元類有一個類型?

class Test(object): 
    pass 


print Test.__class__ 
print Test.__class__.__class__ 
print Test.__class__.__class__.__class__ 

所有的結果都是一樣的type。但他們的每個地址都不相同
我無法真正理解爲什麼元類遞歸地具有元類。
請解釋一下嗎?

回答

2

其實,地址是相同的:

>>> id(Test.__class__) 
6384576 
>>> id(Test.__class__.__class__) 
6384576 
>>> id(Test.__class__.__class__.__class__) 
6384576 

一切都在Python的對象,每個對象必須有一個類(它應該屬於某種類型)。可以通過__class__屬性訪問類/型號,例如:

>>> (1).__class__ 
<type 'int'> 

一切包括類本身,這是類/類型,稱爲type的:

​​

在同一時間type 'type'>也是一個對象並應引用某些類/類型。但由於這是一種特殊的對象,它的屬性__class__提到自己:

>>> (1).__class__.__class__.__class__ is (1).__class__.__class__ 
True 
+0

謝謝,我誤解其附加雷斯是不一樣的。 –

0

當你做Test.__class__,你會得到類型Test,這是type(因爲Test是一個類標識符)。

type本身又是一個類標識符,這樣你就可以調用__class__(從object繼承)就可以了,你回來,它的類型是,再次,type因爲它是一個類標識符。

因爲你總是會回來type,這本身就是一個類,你可以無限次地做到這一點,並且總是會回到當前對象的類型爲type

0

所有的類都是類,這意味着它們是從一個叫做類類派生...

0

所有python的類對象是通過內置的函數類型建立()。你也可以試試這個。

>>> T.__class__ == type 
True 
>>> type(type) 
<type 'type'> 

的T. 類等於內建功能型這也是一個對象實現的呼叫功能。這是一個屬性將被解釋爲(T)。由於你的T類沒有基類,因此使用type()將返回類型對象。

你可以檢查關於customizing class creation的python文檔來獲得關於類創建的詳細信息。

爲了確定適當的元類

  • 如果沒有鹼和沒有明確的元類中給出,然後鍵入()用於
  • 如果顯式的元類,並給出它不是類型的實例() ,那麼如果類型的實例()被給定爲顯式的元類,或鹼被定義它直接用作元類
  • ,那麼最派生元類是用來
相關問題