OVH Cloud OVH Cloud

Affecter l'attribut __dict__ d'une classe

2 réponses
Avatar
Emmanuel
Bonjour à tous,

J'aurais voulu savoir si l'exemple suivant est bon ou mauvais :

class A :
a = 5
b = 6

a = A()
a.__dict__ = {"a" : 3, "c" : 4}


Techniquement, cela change l'attribut a, et cela rajoute le c. J'aurais
voulu savoir si c'était une astuce / faille au niveau de l'implémentation,
ou s'il s'agissait d'une fonctionnalité du langage.

Merci de votre réponse.

--
manu

2 réponses

Avatar
Do Re Mi chel La Si Do
Bonsoir !

Pour moi, c'est correct.

Mais, pour faire la même chose, on pourrait écrire :

class A :
a = 5
b = 6

a = A()
a.c = 4

@-salutations

Michel Claveau
Avatar
Bruno Desthuilliers
Bonjour à tous,

J'aurais voulu savoir si l'exemple suivant est bon ou mauvais :

class A :
a = 5
b = 6


Attention, avec une telle définition, les noms a et b appartiennent au
__dict__ de la classe, pas à celui des instances de A.

a = A()
a.__dict__ = {"a" : 3, "c" : 4}


Techniquement, cela change l'attribut a,


Non, cela *crée* l'attribut a dans a (ce qui incidemment masque
l'attribut a de A).

et cela rajoute le c. J'aurais
voulu savoir si c'était une astuce / faille au niveau de l'implémentation,
ou s'il s'agissait d'une fonctionnalité du langage.


Un peu les deux.

Ce n'est pas à proprement parler une 'faille', juste une exploitation du
fait que les attributs sont (généralement) stockés dans un dictionnaire,
ce qui permet ce raccourci parfois bien pratique pour éviter du code
fastidieux. C'est quand même limite hack dans la mesure où cela
court-circuite pas mal d'autre mécanismes (properties, descriptors etc).
Bref, ce n'est à utiliser qu'avec précaution...