2009-05-04 14 views
6

Ho cercato di imparare le metaclassi in Python. Ho un'idea generale, ma non riesco ad attivare il meccanismo. A quanto ho capito, puoi specificare M come metaclasse quando costruisci una classe K impostando __metaclass__ su M a livello globale o di classe. Per testare il tutto, ho scritto il seguente programma:Non dovrebbe __metaclass__ forzare l'uso di una metaclasse in Python?

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) 

Tuttavia, quando l'eseguo, ottengo il seguente output:

 
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 

non dovrei vedere "La pioggia in Spagna" dopo 1 e 2? Cosa sta succedendo qui?

+1

Il doppio negativo "non ... non forza" è difficile da analizzare. Potrebbe risolvere la domanda, per favore? –

+0

Grazie per il feedback. Penso che dovrebbe essere più facile da capire ora. – allyourcode

risposta

13

In Python 3 (che si sta utilizzando) metaclassi sono specificate da un parametro parola chiave nella definizione della classe:

class ClassMeta(metaclass=M): 
    pass 

specificando una proprietà __metaclass__ classe o variabile globale è vecchia sintassi da Python 2.x e non più supportato. Vedi anche "What's new in Python 3" e PEP 2115.

2

Questo funziona come ci si aspetta in Python 2.6 (e precedenti), ma in 3,0 metaclassi sono specificate in modo diverso:

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

La sintassi di metaclassi ha changed in Python 3.0. L'attributo __metaclass__ non è più speciale né per la classe né per il livello del modulo. Per fare quello che stai cercando di fare, è necessario specificare metaclass come argomento parola chiave per la dichiarazione class:

p = print 

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

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

Resa:

1 
The rain in Spain 

Come ci si aspetterebbe.

Problemi correlati