2016-05-03 6 views
-1
class Dog: 
    def __init__(self, ap1) 
    self.name = ap1 
    self.tricks = [] 
    def.addTrick(self, ap1) 
    self.tricks.append(ap1) 

Also oben habe ich eine Klasse, die dazu bestimmt ist, Instanzen von Hunden zu spawnen.Ist es möglich, auf eine Klasseninstanz zu verweisen, ohne die Variable zu verwenden, in der sie gespeichert ist?

curDog=Dog("Seymour") 
curDog.addTrick("Wait Forever") 
print("curDog is " + curDog.name) 
print(curDog.name + " knows " + str(curDog.tricks)) 
print("") 

curDog=Dog("Brian") 
curDog.addTrick("Psuedo Intellectual Debate") 
print("curDog is " + curDog.name) 
print(curDog.name + " knows " + str(curDog.tricks)) 
print("") 

Und hier oben habe ich zwei Instanzen, Dog('Seymour') und Dog('Brian'), die gleiche Variable curDog (aktueller Hund) besetzt, seriell. Die Ausgabe sieht wie folgt aus:

>>> main() 
curDog is Seymour 
Seymour knows ['Wait Forever'] 

curDog is Brian 
Brian knows ['Pseudo Intellectual Debate'] 

>>> 

Offensichtlich Mir ist klar, dass, sobald curDog verwendet wird Brian zu speichern, dass sie nicht mehr Seymour verweisen wird. Aber an diesem Punkt frage ich mich, was mit Seymour passiert ist. Ist er noch draußen in der Umwelt Äther, nur von der variablen Verbindung getrennt? Oder ist er völlig ausgelöscht, um Platz für Brian zu machen?

Wenn der ehemalige, wie kann ich ihn und seine Trick-Liste zugreifen?

Mehr zu dem ursprünglichen Punkt des Beitrags, ist es möglich, Brian ohne Verwendung von curDog zu verweisen? Ich habe versucht, wie print("Brian".tricks) und print(Dog('Brian').tricks), aber ich war nicht sehr überrascht, wenn sie nicht funktionierten.

Gibt es eine Möglichkeit, dies zu tun? Gibt es eine bessere Möglichkeit Klasseninstanzen zu verstehen, die mir helfen könnten, dies selbst zu beantworten?

+1

Sobald keine Referenzen auf ein Objekt mehr vorhanden sind, wird es für die Garbage-Collection freigegeben - an einem unbestimmten Punkt in der Zukunft wird es im Speicher mit etwas anderem überschrieben. Wenn Sie Zugriff auf mehrere Instanzen behalten möchten, legen Sie sie in ein Wörterbuch oder eine Liste. – jonrsharpe

+1

Der Begriff, den Sie suchen, ist "Garbage Collection". Es wurde viel darüber geschrieben. Zum Beispiel: http://arctrix.com/nas/python/gc/ –

Antwort

1

Sie können dies beheben, indem Sie einen Code hinzufügen, der Ihnen sagt, wann Seymour den Müll sammelt.

class Dog: 
    # ... 
    def __del__(self): 
    print('*** deleting {} ***'.format(self.name)) 

den Code mit diesem Zusatz Laufe zeigt Ihnen genau, was passiert:

curDog is Seymour 
Seymour knows ['Wait Forever'] 

*** deleting Seymour *** 
curDog is Brian 
Brian knows ['Psuedo Intellectual Debate'] 

*** deleting Brian *** 

Bemerken Es ist erwähnenswert, dass es keine Garantie gibt das Programm auf diese Weise zu verhalten hat. Der Python-Interpreter hat die Option, darauf zu warten, Seymour bis zu einem späteren Zeitpunkt zu entfernen - vielleicht, wenn das Programm endet oder wenn es Speicher benötigt, oder so. Schreiben Sie also keine Python-Programme, die darauf angewiesen sind, dass Objekte sofort von Müll gesammelt werden. In der Praxis hat das Warten jedoch keinen Vorteil, daher löscht der Interpreter Objekte, sobald sie nicht mehr referenziert werden.

Es kann natürlich mehrere Referenzen auf ein Objekt geben - das heißt, das gleiche Objekt kann in mehreren Variablen gespeichert werden. Sie könnten eine neue Variable curDog2 erstellen und Seymour darin speichern. Wenn Sie Brian dann curDog zuweisen, wird Seymour weiterhin von curDog2 referenziert, was dem Interpreter einen Grund gibt, ihn nicht zu sammeln. Objekte verschwinden nur auf diese Weise, wenn keine Referenzen auf sie übrig sind. (Schwache Referenzen nicht mitgerechnet, aber das ist eine ganz andere Geschichte.)

Der Interpreter erstellt jedoch keine eigenen Referenzen auf Ihre benutzerdefinierten Objekte. Es gibt also keine Möglichkeit, auf ein Objekt zuzugreifen, außer durch eine Variable oder etwas, in dem Sie es gespeichert haben.

+0

Eine perfekte Antwort. Vielen Dank. – Musixauce3000

Verwandte Themen