Metaklassen werden im Allgemeinen zum Erstellen von Klassen verwendet. Beim Ausführen einer Klassendefinition muss der Interpreter die richtige Metaklasse der Klasse kennen. Der Interpreter sucht zunächst nach dem Klassenattribut __metaclass__. Wenn dieses Attribut vorhanden ist, weist er dieses Attribut dieser Klasse als Metaklasse zu. Wenn dieses Attribut nicht definiert ist, sucht es nach dem __metaclass__ in der übergeordneten Klasse. Wenn das __metaclass__-Attribut noch nicht gefunden wird, überprüft der Interpreter die globale Variable mit dem Namen __metaclass__ und verwendet sie, falls vorhanden, als Metaklasse. Andernfalls handelt es sich bei der Klasse um eine traditionelle Klasse mit „types.ClassType“ als Metaklasse.
Beim Ausführen der Klassendefinition wird die korrekte (normalerweise Standard-)Metaklasse dieser Klasse überprüft. Die Metaklasse übergibt (normalerweise) drei Parameter (an den Konstruktor): Klassenname, geerbt von der Basisklasse Ein Tupel von Daten und ein Wörterbuch von Attributen (von Klassen).
Wann wird die Metaklasse erstellt?
#!/usr/bin/env python print '1. Metaclass declaration' class Meta(type): def __init__(cls, name, bases, attrd): super(Meta,cls).__init__(name,bases,attrd) print '3. Create class %r' % (name) print '2. Class Foo declaration' class Foo(object): __metaclass__=Meta def __init__(self): print '*. Init class %r' %(self.__class__.__name__) # 何问起 hovertree.com print '4. Class Foo f1 instantiation' f1=Foo() print '5. Class Foo f2 instantiation' f2=Foo() print 'END' 输出
Ergebnis:
1. Metaklassendeklaration
2. Klassen-Foo-Deklaration
3. Klasse 'Foo' erstellen
Klasse Foo f1 Instanziierung
* Klasse Foo f2 Instanziierung
*. Init-Klasse 'Foo'
ENDE
Es ist ersichtlich, dass __metaclass_ ausgeführt wird, wenn die Klasse ist deklariert. _. Bei der zukünftigen Definition eines Klassenobjekts wird nur die __init__()-Methode in MetaClass aufgerufen.