Question

J'ai essayé d'apprendre des métaclasses en Python. Je comprends l'idée principale, mais je n'arrive pas à activer le mécanisme. Si je comprends bien, vous pouvez spécifier que M soit la métaclasse lors de la construction d'une classe K en définissant __ métaclasse __ sur M au niveau global ou au niveau de la classe. Pour tester cela, j’ai écrit le programme suivant:

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)

Cependant, lorsque je l'exécute, j'obtiens le résultat suivant:

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

Ne devrais-je pas voir " La pluie en Espagne " après 1 et 2? Que se passe-t-il ici?

Était-ce utile?

La solution

Dans Python 3 (que vous utilisez), les métaclasses sont spécifiées par un paramètre de mot-clé dans la définition de la classe:

class ClassMeta(metaclass=M):
  pass

La spécification d'une propriété de classe ou d'une variable globale __ metaclass __ correspond à l'ancienne syntaxe de Python 2.x et n'est plus prise en charge. Voir aussi "Nouveautés de Python 3" et < a href = "http://www.python.org/dev/peps/pep-3115/" rel = "nofollow noreferrer"> PEP 2115 .

Autres conseils

Cela fonctionne comme prévu dans Python 2.6 (et versions antérieures), mais dans la version 3.0, les métaclasses sont spécifiées différemment:

class ArgMeta(metaclass=M): ...

La syntaxe des métaclasses a modifiée dans Python 3.0. L'attribut __ metaclass __ n'est plus spécial ni au niveau de la classe ni du module. Pour faire ce que vous essayez de faire, vous devez spécifier métaclasse en tant qu'argument de mot clé de l'instruction class :

p = print

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

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

Rendements:

1
The rain in Spain

Comme vous vous en doutez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top