Les métaclasses sont chargées de créer des objets de classe en Python. Tout comme les classes créent des instances, les métaclasses créent des classes. Ils fournissent une couche de contrôle sur le processus de création de classe, permettant de personnaliser le comportement et les attributs de la classe.
En Python, les classes sont des objets qui décrivent le plan pour créer de nouvelles instances ou objets. Cela signifie que les classes elles-mêmes sont des instances créées à partir d'une « description » de la classe à l'aide du mot-clé class. Ainsi, l'instruction suivante crée un objet de classe nommé ObjectCreator :
class ObjectCreator(object): pass
Étant donné que les classes sont des objets, vous pouvez les créer dynamiquement, même au moment de l'exécution. La fonction type vous permet de définir une classe en fournissant son nom, ses bases et ses attributs comme arguments. Il renvoie un objet de classe nouvellement créé.
Foo = type('Foo', (), {'bar': True}) print(Foo) # <class '__main__.Foo'> print(Foo.bar) # True
Maintenant, nous arrivons aux métaclasses. Ce sont les « éléments » qui créent ces objets de classe. Tout comme les classes créent des instances, les métaclasses créent des classes. Ce sont en fait les classes en arrière-plan que Python utilise automatiquement pour créer des classes définies à l'aide du mot-clé class.
Dans Python 2, vous pouvez spécifier un Attribut __metaclass__ lors de la définition d'une classe pour utiliser une métaclasse personnalisée pour créer cette classe. Dans Python 3, cela a été remplacé par un argument mot-clé dans la liste des classes de base.
# Python 2 class Foo(object, __metaclass__=MyMetaclass): ... # Python 3 class Foo(object, metaclass=MyMetaclass): ...
Une métaclasse peut modifier la classe qu'elle crée, permettant une dynamique comportement de classe. Par exemple, vous pouvez définir une métaclasse qui convertit automatiquement tous les attributs de classe en majuscules :
class UpperAttrMetaclass(type): def __new__(cls, clsname, bases, attrs): uppercase_attrs = { attr if attr.startswith('__') else attr.upper(): v for attr, v in attrs.items() } return super().__new__(cls, clsname, bases, uppercase_attrs)
Ensuite, vous pouvez utiliser cette métaclasse pour créer une classe avec des attributs en majuscules :
class Foo(object, metaclass=UpperAttrMetaclass): bar = 'bip' print(Foo.bar) # 'BIP'
Bien que vous n'ayez généralement pas besoin de métaclasses, elles trouvent des cas d'utilisation dans la création d'API qui éliminent la complexité de la classe. modification derrière une interface simple. Par exemple, l'ORM de Django utilise des métaclasses pour vous permettre de définir des champs de base de données à l'aide d'instructions simples comme CharField et IntegerField.
Les métaclasses en Python sont un outil puissant qui vous permet de contrôler la création de classes. Cependant, il est important de noter qu'ils sont complexes et ne doivent être utilisés qu'en cas de nécessité pour éviter des complications inutiles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!