Python-Basisklassen teilen sich Attribute? [Duplikat]

8

Code in test.py:

%Vor%

Python Shell-Sitzung:

%Vor%

Ich erwartete "C ++ - like" Verhalten, bei dem jedes abgeleitete Objekt seine eigene Instanz der Basisklasse enthält. Ist das immer noch so? Warum scheint jedes Objekt die gleiche Listeninstanz zu haben?

    
tad 21.05.2010, 04:06
quelle

2 Antworten

14

Sie machen einen häufigen Python-Neueinsteiger-Fehler.

Siehe meine Antwort hier: Wie sollte ich Standardwerte deklarieren? zum Beispiel Variablen in Python?

Kurz gesagt, interpretiert Python die Klassendefinitionen nur einmal . Das bedeutet, dass alles, was in der Methode __init__() deklariert wurde, nur einmal erstellt wird. Oder, mit anderen Worten, Ihr [] list default Argument wird nur einmal gemacht.

Dann weist self.l = l bei jedem Erstellen einer neuen Klasse der gleichen Instanz eine Referenz zu, daher das Verhalten, das Sie nicht erwartet haben.

Der pythonische Weg ist dies (Teilcode):

%Vor%

Sie sollten auch überlegen, eine bessere Namenskonvention als l zu verwenden, die schwer zu lesen ist und fälschlicherweise als 1 oder | gilt.

    
Xavier Ho 21.05.2010, 04:11
quelle
2

Dies wird der veränderbare Fehler im Standardargument genannt, der üblicherweise von Leuten gemacht wird, die neu in Python sind. Wenn Sie ein mutable-Objekt als Standardargument angeben, wird dasselbe Objekt für alle Instanzen verwendet, wenn das Standardargument verwendet werden muss. Zum besseren Verständnis lesen Sie den Abschnitt Wichtiger Hinweis in Ссылка

In Ihrem Code verwendete die Instanz a das veränderbare Standardargument (ein leeres Listenobjekt) in ihrem Init-Aufruf, und als Sie die Instanz von b erstellt haben, die wiederum die init-Methode von Base verwendete, verwendete sie dasselbe Objekt wie a in seiner init verwendet. Bei einfacheren Wörtern zeigen a.l und b.l auf dasselbe Listenobjekt.

Eine sehr ähnliche Diskussion - "Least Astonishment" und der Mutable Default Argument

    
Parthan 21.05.2010 04:23
quelle

Tags und Links