J'ai confondu une variable de classe avec une variable d'instance en Python, donc cela n'a pas fonctionné comme prévu. Faites une note pour référence.
Cela semble être une erreur courante et il existe des articles traitant du même sujet.
Les points sont résumés dans ce commentaire.
Le comportement de python est que lorsqu'il fait référence à self.odds, il se réfère d'abord à la variable d'instance, sinon il se réfère à la variable de classe.
Un autre article attire également l'attention.
Lorsque vous accédez aux variables de classe, vous devez éviter d'y accéder comme "variables instance.class" ou "variables self.class" à moins que vous n'ayez une raison spécifique de le faire. En Python, les variables d'instance peuvent être créées à partir d'objets d'instance, qui peuvent involontairement masquer des variables de classe avec des variables d'instance.
Voyons cela avec un exemple simple.
Puisque je peux accéder aux variables de classe via self
, j'ai mal compris que j'avais défini une variable d'instance.
class Test:
a = []
def append(self, value):
self.a.append(value)
def clear(self):
self.a = []
t1 = Test()
t1.append(123)
print(t1.a)
t1.clear()
print(t1.a)
Résultat d'exécution
[123]
[]
En regardant cela, j'ai pensé que la valeur était effacée. En réalité, les variables de classe sont simplement masquées par les variables d'instance du même nom.
Si vous créez une autre instance, vous verrez la variable de classe avec «123» ajouté.
t2 = Test()
print(t2.a)
Résultat d'exécution
[123]
Ce qui m'intéressait vraiment, c'était un programme qui appelait «clear» plusieurs fois. Même si j'ai remarqué que le comportement était étrange, je n'ai pas prêté attention à l'état immédiatement après la création de l'instance, et l'enquête sur la cause a été retardée.
Initialisons la variable d'instance avec le constructeur.
class Test:
def __init__(self):
self.a = []
Recommended Posts