2009-05-04 7 views
6

Ich habe versucht, über Metaklassen in Python zu lernen. Ich habe die Hauptidee, aber ich kann den Mechanismus nicht aktivieren. Wie ich es verstehe, können Sie M als Metaklasse angeben, wenn Sie eine Klasse K konstruieren, indem Sie 0 auf globaler Ebene oder auf Klassenebene auf M setzen (__metaclass__). Um dies zu testen aus, schrieb ich das folgende Programm:Sollte nicht __metaclass__ die Verwendung einer Metaklasse in Python erzwingen?

p = print 

class M(type): 
    def __init__(*args): 
     type.__init__(*args) 
     print("The rain in Spain") 

p(1) 
class ClassMeta: 
    __metaclass__ = M 

p(2) 
__metaclass__ = M 
class GlobalMeta: pass 

p(3) 
M('NotMeta2',(), {}) 

p(4) 

Allerdings, wenn ich es laufen lasse, erhalte ich die folgende Ausgabe:

 
C:\Documents and Settings\Daniel Wong\Desktop>python --version 
Python 3.0.1 

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py 
1 
2 
3 
The rain in Spain 
4 

Sollte ich nicht sehen „Die regen in Spanien“ nach 1 und 2? Was ist denn hier los?

+1

Das doppelte Negativ "nicht ... nicht erzwingen" ist schwer zu analysieren. Könnten Sie bitte die Frage klären? –

+0

Danke für die Rückmeldung. Ich denke, es sollte jetzt einfacher zu verstehen sein. – allyourcode

Antwort

13

In Python 3 (die Sie verwenden) metaclasses durch ein Schlüsselwort Parameter in der Klassendefinition angegeben sind:

class ClassMeta(metaclass=M): 
    pass 

eine __metaclass__ Klasse Eigenschaft oder globale Variable ist alte Syntax von Python 2.x angeben und nicht länger unterstützt. Siehe auch "What's new in Python 3" und PEP 2115.

2

Dies funktioniert, wie Sie in Python 2.6 (und früher), aber in 3.0 metaclasses angegeben anders erwarten:

class ArgMeta(metaclass=M): ... 
2

Die Syntax von metaclasses hat changed in Python 3.0. Das Attribut __metaclass__ ist weder auf Klassen- noch auf Modulebene mehr speziell. Zu tun, was Sie versuchen zu tun, müssen Sie metaclass als Schlüsselwort Argument der class Anweisung angeben:

p = print 

class M(type): 
    def __init__(*args): 
     type.__init__(*args) 
     print("The rain in Spain") 

p(1) 
class ClassMeta(metaclass=M): pass 

Ausbeuten:

1 
The rain in Spain 

Wie man erwarten würde.

Verwandte Themen