La syntaxe d'utilisation de la métaclasse est différente entre python2.x et python3.x. D'autre part, vous souhaiterez peut-être prendre en charge les deux versions dans un seul fichier. Comment écrire dans un tel cas.
metaclass(HasVersion)
Il existe la métaclasse suivante HasVersionMeta. Une méta classe qui a simplement une chaîne comme un numéro de version.
class HasVersionMeta(type):
def __new__(cls, name, bases, attrs):
attrs["version"] = "0.0.1"
return super(HasVersionMeta, cls).__new__(cls, name, bases, attrs)
Je veux définir une classe qui l'utilise.
Dans le cas de python3, ajoutez l'option metaclass à la partie de l'argument passée au moment de l'héritage.
class A(object, metaclass=HasVersionMeta):
pass
Pour python2, assignez-le à un hook avec un nom spécial metaclass
class A(object):
__metaclass__ = HasVersionMeta
La classe utilisée comme métaclasse est également un objet appelable. Étant donné que le type de classe parent () est utilisé lors de la génération dynamique d'une classe, il doit avoir la même fonction. Vous pouvez donc écrire comme suit.
HasVersion = HasVersionMeta("A", (object, ), {"__doc__": HasVersionMeta.__doc__})
class A(HasVersion):
pass
Fonctionner.
print(A.version)
# 0.0.1
Recommended Posts