2012-05-08 19 views
5

在Python 2.x中,所有新式類都從object隱式或顯式繼承。然後看看這個:舊式類,新式類和元類

>>> class M(type): 
...  pass 
... 
>>> class A: 
...  __metaclass__ = M 
... 
>>> class B: 
...  pass 
... 
>>> a = A() 
>>> b = B() 
>>> type(A) 
<class '__main__.M'> 
>>> type(a) 
<class '__main__.A'> 

這是否意味着A是一種新式類?但是A反正不會繼承object吧?

>>> type(B) 
<class 'classobj'> 
>>> type(b) 
<type 'instance'> 

行,B是一個經典的類,不是嗎?

>>> isinstance(A, object) 
True 
>>> isinstance(B, object) 
True 

爲什麼都A的實例和objectB實例?

如果Bobject的實例,那麼type(B)不會是classobj,對不對?

+4

什麼都是對象! – orlp

+0

你不應該在這個問題中使用'__slots__'。這完全是另一個問題。 –

+0

@ChrisMorgan,是的,我剛剛意識到這一點。 – Alcott

回答

5

關於您可能在這裏閱讀的元類:http://docs.python.org/reference/datamodel.html#customizing-class-creation。一般來說,元類是用來處理新的風格類的。當你寫:

class M(type): 
    pass 

,並使用:

class C: 
    __metaclass__ = M 

因爲這樣M定義,將創建一個新的樣式對象(默認實現使用type創建一個新的樣式類)。您始終可以使用types.ClassType來實現自己的元類,該元類將創建舊式類。