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.
Mais, pour faire la même chose, on pourrait écrire :
class A : a = 5 b = 6
a = A() a.c = 4
@-salutations
Michel Claveau
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...
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...
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...