J'étais accro aux variables de classe et aux variables d'instance erronées en Python

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.

Aperçu

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.

Pièges

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.

Contre-mesures

Initialisons la variable d'instance avec le constructeur.

class Test:
    def __init__(self):
        self.a = []

Recommended Posts

J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Python: variables de classe et d'instance
Variables de classe et d'instance Python
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
J'étais accro au grattage avec Selenium (+ Python) en 2020
Ordre de référence des variables de classe et des variables d'instance dans "self. Variables de classe" en Python
Ce à quoi j'étais accro en combinant l'héritage de classe et l'héritage de table commune dans SQLAlchemy
Ce que j'étais accro à Python autorun
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
Je suis mort en pensant qu'une variable de classe Python était une variable d'instance
Python: j'ai pu récurer en lambda
[python] Différence entre variable et self. Variable dans la classe
J'ai écrit une classe en Python3 et Java
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
[Python] Comment trier un dict dans une liste et une instance dans une liste
Python: peut être répété en lambda
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Afficher les nombres et les caractères affectés aux variables dans l'impression python
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
Les mines terrestres cachées dans les variables de classe Python
Définitions de classe Python et gestion des instances
J'étais accro au multitraitement + psycopg2
Quand j'ai essayé d'installer PIL et matplotlib dans un environnement virtualenv, j'en étais accro.
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
J'ai essayé d'implémenter PLSA en Python
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'ai essayé d'implémenter la permutation en Python
Comment définir dynamiquement des variables en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'étais accro à Flask sur dotCloud
J'ai essayé d'implémenter ADALINE en Python
Pour référencer des variables d'environnement en Python dans Blender
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
Comment utiliser __slots__ dans la classe Python
Comment utiliser is et == en Python
J'étais accro à la création d'un environnement Python venv avec VS Code
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
[Python] classe, instance
L'intelligence de Numpy (saisie complète) est incomplète dans VS Code et j'étais légèrement accro à la solution
classe python, instance
Je veux faire le test de Dunnett en Python
Variables Python et types de données appris avec la chimio-automatique
[Introduction à json] Non, j'en étais accro. .. .. ♬
Je veux créer une fenêtre avec Python
J'ai écrit "Introduction à la vérification des effets" en Python
Envoyer un message à Skype et Chatwork en Python
Je veux fusionner des dictionnaires imbriqués en Python
Problème avec les variables pseudo-privées Python et l'héritage de classe
J'ai essayé d'implémenter TOPIC MODEL en Python