Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python

Ich habe eine Klassenvariable mit einer Instanzvariablen in Python verwechselt, daher hat es nicht wie erwartet funktioniert. Notieren Sie sich dies als Referenz.

Überblick

Es scheint ein häufiger Fehler zu sein, und es gibt Artikel, die sich mit demselben Thema befassen.

Die Punkte sind in diesem Kommentar zusammengefasst.

Python verhält sich beim Verweisen auf self.odds zunächst auf die Instanzvariable, andernfalls auf die Klassenvariable.

Ein anderer Artikel macht ebenfalls auf sich aufmerksam.

Wenn Sie auf Klassenvariablen zugreifen, sollten Sie vermeiden, auf sie wie "instance.class-Variablen" oder "self.class-Variablen" zuzugreifen, es sei denn, Sie haben einen bestimmten Grund dafür. In Python können Instanzvariablen aus Instanzobjekten erstellt werden, wodurch Klassenvariablen mit Instanzvariablen unbeabsichtigt ausgeblendet werden können.

Lassen Sie uns dies anhand eines einfachen Beispiels sehen.

Tücken

Da ich über self auf Klassenvariablen zugreifen kann, habe ich falsch verstanden, dass ich eine Instanzvariable definiert habe.

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)

Ausführungsergebnis


[123]
[]

Als ich das betrachtete, dachte ich, dass der Wert gelöscht wurde. In der Realität werden die Klassenvariablen einfach durch die gleichnamigen Instanzvariablen verdeckt.

Wenn Sie eine andere Instanz erstellen, wird die Klassenvariable mit dem Zusatz 123 angezeigt.

t2 = Test()
print(t2.a)

Ausführungsergebnis


[123]

Was mich wirklich interessierte, war ein Programm, das viele Male "klar" genannt wurde. Obwohl ich bemerkte, dass das Verhalten seltsam war, achtete ich nicht unmittelbar nach der Erstellung der Instanz auf den Zustand, und die Untersuchung der Ursache verzögerte sich.

Gegenmaßnahmen

Initialisieren wir die Instanzvariable mit dem Konstruktor.

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

Recommended Posts

Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Python: Klassen- und Instanzvariablen
Python-Klassen- und Instanzvariablen
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Referenzreihenfolge von Klassenvariablen und Instanzvariablen in "self. Klassenvariablen" in Python
Wovon ich süchtig war, als ich Klassenvererbung und gemeinsame Tabellenvererbung in SQLAlchemy kombinierte
Was ich süchtig nach Python Autorun war
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable
Python: Ich konnte in Lambda rekursieren
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Ich habe eine Klasse in Python3 und Java geschrieben
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
[Python] So sortieren Sie Diktate in Listen und Instanzen in Listen
Python: Kann in Lambda wiederholt werden
Ich war süchtig danach, logging.getLogger mit Flask 1.1.x zu versuchen
Wovon ich süchtig war, als ich Python Tornado benutzte
Ich war nüchtern süchtig danach, awscli von einem in crontab registrierten Python 2.7-Skript aus aufzurufen
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
Zeigen Sie Zahlen und Zeichen an, die Variablen im Python-Druck zugewiesen sind
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
In Python-Klassenvariablen versteckte Landminen
Python-Klassendefinitionen und Instanzbehandlung
Ich war süchtig nach Multiprocessing + Psycopg2
Als ich versuchte, PIL und matplotlib in einer virtuellen Umgebung zu installieren, war ich süchtig danach.
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Ich habe versucht, PLSA in Python zu implementieren
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich habe versucht, Permutation in Python zu implementieren
Dynamisches Definieren von Variablen in Python
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich war auf dotCloud süchtig nach Flask
Ich habe versucht, ADALINE in Python zu implementieren
Verweisen auf Umgebungsvariablen in Python in Blender
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
Verwendung von __slots__ in der Python-Klasse
Verwendung ist und == in Python
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
[Python] -Klasse, Instanz
Numpys Intelligenz (Eingabevervollständigung) ist in VS Code unvollständig und ich war leicht süchtig nach der Lösung
Python-Klasse, Instanz
Ich möchte Dunnetts Test in Python machen
Python-Variablen und Datentypen, die mit Chemoinfomatik gelernt wurden
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Ich möchte mit Python ein Fenster erstellen
Geschrieben "Einführung in die Effektüberprüfung" in Python
Senden Sie eine Nachricht an Skype und Chatwork in Python
Ich möchte verschachtelte Dicts in Python zusammenführen
Probleme mit pseudo-privaten Python-Variablen und Klassenvererbung
Ich habe versucht, TOPIC MODEL in Python zu implementieren