Que sont les métaclasses en Python?

Que sont les métaclasses ? Et a quoi servent-elles ?

Avant de parler des métaclasses, vous devez maîtriser les classes en Python.

Une métaclasse est la classe d’une classe. Une classe définit le comportement d’une instance (c’est-à-dire un objet) tandis qu’une métaclasse définit le comportement d’une classe. Une classe est une instance d’une métaclasse.

Métaclasse est utilisée le plus souvent comme une class-factory. Lorsque vous créez un objet en appelant la classe, Python crée une nouvelle classe (lorsqu’il exécute l’instruction ‹ class ›) en appelant la métaclasse. Combinées aux méthodes normales init et new, les métaclasses vous permettent donc de faire des « choses supplémentaires » lors de la création d’une classe, comme enregistrer la nouvelle classe dans un registre ou la remplacer par quelque chose d’entièrement différent.

Une des utilisations des métaclasses est l’ajout automatique de nouvelles propriétés et méthodes à une instance.

Une métaclasse instancie et définit le comportement d’une classe tout comme une classe instancie et définit le comportement d’une instance(objet).

>>> Class(...)
instance

Ce qui est écrit ci-dessus devrait vous dire quelque chose. Eh bien, d’où vient Class ? C’est une instance d’une métaclasse

>>> Metaclass(...)
Class

Dans le vrai code, nous pouvons passer la métaclasse par défaut, le type, tout ce dont nous avons besoin pour instancier une classe et nous obtenons une classe :

>>> type('MaClasse', (object,), {}) # requiert un nom, base et un espace de nom.
<class '__main__.MaClasse'>

La fonction type(obj) permet d’obtenir le type d’un objet.

La fonction type() d’une classe est sa métaclasse.

Pour utiliser une métaclasse :

class MaClasse(objet):
    __metaclass__ = MaMetaClasse

La fonction type() est sa propre métaclasse. La classe d’une classe est une métaclasse - le corps d’une classe est constitué des arguments passés à la métaclasse qui est utilisée pour construire la classe.