2012-05-08 18 views
5

In Python 2.x, tutte le classi di nuovo stile ereditano da object implicitamente o esplicitamente. Poi un'occhiata a questo:Vecchio stile, classi di nuovo stile e metaclassi

>>> 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'> 

Significa questo A è una classe di nuovo stile? Ma A non eredita comunque da object, giusto?

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

OK, B è una classe classico, non è vero?

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

perché sono istanze di entrambi A e B istanze di object?

Se B è un'istanza di object, quindi type(B) non sarebbe classobj, giusto?

+4

Tutto è un oggetto! – orlp

+0

Non dovresti aver messo la cosa '__slots__' in questa domanda. È un'altra domanda completamente. –

+0

@ChrisMorgan, sì, l'ho appena capito. – Alcott

risposta

5

Chi metaclassi si può leggere qui: http://docs.python.org/reference/datamodel.html#customizing-class-creation. Generalmente le metaclassi sono pensate per lavorare con nuove classi di stile. Quando si scrive:

class M(type): 
    pass 

e si utilizza:

class C: 
    __metaclass__ = M 

verrà creato un nuovo oggetto stile, perché il modo in cui M è definita (implementazione di default utilizza type di creare una classe di nuovo stile). È sempre possibile implementare il proprio metaclasse che creerebbe classi vecchio stile utilizzando types.ClassType.

1

A proposito di slot si può leggere qui http://docs.python.org/release/2.5.2/ref/slots.html, un frammento:

Per impostazione predefinita, le istanze di vecchi e nuovi in ​​stile classi hanno un dizionario per la conservazione degli attributi.

Per le classi di nuovo stile è possibile aggiungere __slots__, quindi il dizionario per oggetto non verrà creato.

Problemi correlati