mardi 21 mars 2023

5 choses à savoir sur les dataclasses Python

La souplesse et les facilités qu'apportent les dataclasses, me font penser qu'un jour les dataclasses se retrouveront mises en  avant dans Python et soient dans le futur, le moyen natif de créer des classes.

(le notebook ci-dessous se retrouve sur mon github)

1) Comment savoir quel sera le comportement du constructeur de la classe ?

Le constructeur de la classe est généré par la dataclasse et il n'est pas visible en l'état.

Pour comprendre ce qui va se passer, on utilisera le module 'dis' qui permet de désassembler le code Python. Un source Python est traduit en bycode qui sera exécuté par la VM Python. Le module 'dis' montre la traduction qui sera faite de ce bytecode.

Exemple: Soit une classe dont le constructeur attend deux paramètres ident et nom.


L'utilisation du module dis donnera: 



Sur le listing, on  retrouve sans trop de difficulté les deux opérations d'initialisation du constructeur.

Il y  toujours la possibilité de modifier l'instanciation d'un nouvel objet en implémentant la méthode :__post_init__(). 
Cette méthode est appelée après le constructeur.

2) Dans le cadre de l'héritage, Dataclasse prend en charge pour vous l'appel du constructeur de la classe mère.

Dans le cadre de l'héritage, il est parfois nécessaire de faire appel à super().__init__(...)  pour initialiser les attributs de la classe mère.



Dans la classe fille:

Avec les dataclasses c'est plus simple:

En reprenant la dataclasse Exemple, on voit que le constructeur prend en charge les paramètres pour la classe mère et la classe fille


Attention: si la classe mère propose des valeurs par défaut,  les attributs de la classe fille doivent aussi en fournir. On retrouve ici la règle des paramètres  sans valeur par défaut en premier. C'est pour cela que l'attribut prénom est prévu avec une valeur par défaut.


3) Comment déclarer une variable de classe.

On va devoir utiliser le module  typing 



Avec l'initialisation de la variable de classe

4) Utilisation d'un attribut mutable (exemple: une liste ) dans le constructeur.



Dans cet exemple : l'attribut mail ne sera pas initialisé par le constructeur. Par contre ma_liste va poser un problème et provoquera l'erreur suivante:


Il faudra passer par une fabrique :


5) Il est possible d'adapter le comportement général de la classe en passant des paramètres au décorateur.


Exemple 
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False,
           match_args=True, kw_only=False, slots=False, weakref_slot=False)



Génération du constructeur, de la méthode __repr__  etc.

Ne pas hésiter à consulter la documentation du module par la commande help('dataclasses')  ou directement dans une console pydoc dataclasses


Aucun commentaire: