Ich habe die folgende Klasse, die eine Brust darstellt, in dem Spielzeug (Zahlen) gespeichert werden können:In einer Schleife in Python, ich eine neue Instanz einer Klasse der gleichen Variablen zuweisen, aber es zeigt auf die alte Instanz?
class Chest:
toys = []
def __init__(self):
return
def add(self, num):
self.toys.append(num)
return
Der Hauptcode, der diese Klasse verwendet, ist wie folgt: Also, für jede Iteration
room_of_chests = []
for i in range(3):
print "Chest", i
temp = Chest()
print "Number of toys in the chest:", len(temp.toys)
for j in range(5):
temp.add(j)
print "Number of toys in the chest:", len(temp.toys)
print ""
room_of_chests.append(temp)
von mir, ich erstelle eine neue Brust und machen die Variable temp zeigen Sie darauf (richtig?). Also, in der Theorie würde Temp in jeder Iteration mit einer leeren Truhe beginnen und mit einer Truhe mit 5 Spielzeugen enden (richtig?).
Daher ist die Ausgabe ich erwarte ist:
Chest 0
Number of toys in the chest: 0
Number of toys in the chest: 5
Chest 1
Number of toys in the chest: 0
Number of toys in the chest: 5
Chest 2
Number of toys in the chest: 0
Number of toys in the chest: 5
Aber was ich eigentlich bin immer ist:
Chest 0
Number of toys in the chest: 0
Number of toys in the chest: 5
Chest 1
Number of toys in the chest: 5
Number of toys in the chest: 10
Chest 2
Number of toys in the chest: 10
Number of toys in the chest: 15
Was mache ich falsch? Kann jemand eine kurze Erklärung geben, wie Instanziierung in diesem Fall funktioniert? Und die Regeln von Variablen, die auf Objekte in Python zeigen? Danke im Voraus.
Python-Klassenattribute sind nicht ganz dieselben wie statische oder statische Java-Membervariablen. Die Python-Dokumente sind sehr darauf bedacht, den Begriff "statische Variable" oder "statisches Attribut" nirgendwo zu verwenden, um zu vermeiden, dass irgendetwas impliziert wird, was nicht wahr ist, und es wäre besser, hier dasselbe zu tun. (Sonst tolle Erklärung.) – abarnert
@abarnert, Danke für den Kommentar. Ich werde die Terminologie aktualisieren. – merlin2011
Oh, auch "__init__" ist der Initialisierer; Der Konstruktor (über den man sich selten Sorgen machen muss) ist '__new__'. – abarnert