__Metaclass__ ne devrait-il pas forcer l'utilisation d'une métaclasse en Python?
-
03-07-2019 - |
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?
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.