2012-05-08 15 views
5

In Python 2.x erben alle Klassen im neuen Stil implizit oder explizit von object. Dann folgt aussehen auf:Klassen im alten Stil, Klassen im neuen Stil und Metaklassen

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

diese A bedeutet das ist ein neuer Stil-Klasse? Aber A erbt nicht von object sowieso, oder?

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

OK, ist B eine klassische Klasse, ist es nicht?

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

warum sind Instanzen sowohl A und B Instanzen von object?

Wenn B eine Instanz von object ist, dann wäre type(B) nicht classobj, richtig?

+4

Alles ist ein Objekt! – orlp

+0

Sie sollten die "__slots__" Sache in dieser Frage nicht gestellt haben. Es ist eine ganz andere Frage. –

+0

@ChrisMorgan, ja, das habe ich gerade gemerkt. – Alcott

Antwort

5

Über Metaklassen können Sie hier lesen: http://docs.python.org/reference/datamodel.html#customizing-class-creation. Im Allgemeinen sollen Metaklassen mit neuen Stilklassen arbeiten. Wenn Sie schreiben:

class M(type): 
    pass 

und Sie verwenden:

class C: 
    __metaclass__ = M 

werden Sie ein neues Style-Objekt erstellen, da die Art und Weise M definiert ist (Default-Implementierung verwendet type eine neuen Stil-Klasse zu erstellen). Sie könnten immer Ihre eigene Metaklasse implementieren, die Old-Style-Klassen mit types.ClassType erstellen würde.

1

über Schlitze können Sie hier http://docs.python.org/release/2.5.2/ref/slots.html, ein Fragment lesen:

standardmäßig Instanzen der alten und neuen Stil Klassen haben einen Wörterbuch für Attributspeicher.

Für neue Stil-Klassen können Sie __slots__ hinzufügen, dann ist das pro-Objektverzeichnis wird nicht erstellt werden.

Verwandte Themen