Python -Utiliser la classe metaclass
4 oct. 2022
Une métaclasse en python permet de définir le comportement de l'objet enfant sur lequel il est défini. On retrouve la spécification sur la PEP 3115
Si on prend une classe vide et que l'on analyse son type
On remarque que MyClass est de type
Et pour appliquer cette metaclasse à une classe on la déclare ainsi
metaclass permet d'agir sur le dunder __new__ qui est appelé avant la création de l'objet.
Nous avons également vu qu'il doit hériter de type qui prend 3 paramètres :
Ce qui nous donnerait
Jusque là rien de bien nouveau. Mais si on veut modifier notre instance en ajoutant par exemple un attribut qui correspond à la date de création, on ferait
Ce mécanisme pourrait très bien être implémenté avec de l'héritage simple, c'est à vous de déterminer ce qui est le plus adapté en fonction de votre besoin et du contexte.
On pourrait très bien imaginer une métaclasse qui associe un attribut à un logger
On vient de voir comment type permet de créer des instances de classe et comment vous pouvez vous aussi personnaliser ces objets
blog comments powered by Disqus
Si on prend une classe vide et que l'on analyse son type
On remarque que MyClass est de type
type
Il hérite de la métaclasse type. Donc pour créer une nouvelle métaclasse on faitEt pour appliquer cette metaclasse à une classe on la déclare ainsi
metaclass permet d'agir sur le dunder __new__ qui est appelé avant la création de l'objet.
Nous avons également vu qu'il doit hériter de type qui prend 3 paramètres :
- name: nom de la classe
- bases: tuple des classes parentes
- attrs: dictionaire contenant les noms et valeurs des attributs
return super().__new__(cls, name, bases, dict)
Ce qui nous donnerait
Jusque là rien de bien nouveau. Mais si on veut modifier notre instance en ajoutant par exemple un attribut qui correspond à la date de création, on ferait
Ce mécanisme pourrait très bien être implémenté avec de l'héritage simple, c'est à vous de déterminer ce qui est le plus adapté en fonction de votre besoin et du contexte.
On pourrait très bien imaginer une métaclasse qui associe un attribut à un logger
On vient de voir comment type permet de créer des instances de classe et comment vous pouvez vous aussi personnaliser ces objets