Instanzen werden nicht automatisch gelöscht!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Capucho2002
User
Beiträge: 5
Registriert: Mittwoch 30. Januar 2008, 16:57

Hallo Forum,

habe eine Frage zur Instanzenverwaltung. Benutze python 2.6.2 und Idle.

Code: Alles auswählen

class test:
	Liste=[]
	def __init__(self):
		test.Liste.append(self)

test()
print len(test.Liste)
Wenn ich diesen Code ausführe, kriege ich bei jedem Start als Listenlänge 1.
Gut!
wenn ich jedoch die Klassendefinition importiere, kommt jedesmal eine neue Instanz zu meiner Liste dazu. Falls dieses Thema bereits behandelt wurde, wäre der Link zum Beitrag toll. Ich habe leider nichts gefunden, konnte das Problem aber auch nicht gut umschreiben.
Vorab für die Hilfe vielen Dank! Gruss
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Capucho2002 hat geschrieben:wenn ich jedoch die Klassendefinition importiere, kommt jedesmal eine neue Instanz zu meiner Liste dazu
Ich kann das nicht reproduzieren - auch nicht mit IDLE.
Hast du IDLE mal ganz geschlossen und es dann nochmal probiert?

Im übrigen solltest du dich unbedingt an die Python-Konventionen für Groß-/Kleinschreibung halten: Klassennamen beginnen mit einem Großbuchstaben, alle anderen Bezeichner mit Kleinbuchstaben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Capucho2002 hat geschrieben: wenn ich jedoch die Klassendefinition importiere, kommt jedesmal eine neue Instanz zu meiner Liste dazu.
Was genau meinst Du damit?

Generell: Lies Dir noch mal im Tutorial das Kapitel über Klassen durch! Du erzeugst eine Klassenvariable und keine Instanzvariable. Somit wird immer beim Anlegen eines neuen Objektes das selbige an diese Liste gehängt. Alleine das importieren der Klasse in ein Modul kann diesen Effekt afaik nicht auslösen. Außer, Du hast eben auf Moduleben irgend einen Aufruf stehen, bei dem Du ein Objekt der Klasse erzeugst.

Was mir noch auffällt:
- kein PEP8 (Klassenname klein, Variablenname groß)
- Wozu das ganze eigentlich?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Außerdem solltest du new-style-Klassen verwenden, d.h. Klassen, die von keiner Basisklasse erben, sollten immer von ``object`` erben:

Code: Alles auswählen

class Test(object):
Bei mir stellt sich auch noch die Frage nach dem Sinn bei deinem Code. Beschreibe mal, was du vor hast, mit Python gibt es bestimmt eine bessere Lösung ;)
Capucho2002
User
Beiträge: 5
Registriert: Mittwoch 30. Januar 2008, 16:57

Hallo,

Danke erstmal für die schnelle Antwort

Zu den einzelnen Fragen:
Also das ist ein "sinnfreies" Bsp, aus diesem Grund haben ich auch auf diverse Konventionen verzichtet. Ich bitte um Nachsicht!

Das Problem tritt bei bei mir bei der dehnungsabhängigen Momentenberechnung eines beliebigen aus verschiedenen Materialien bestehenden Querschnitts auf, den ich aus Flächen zusammensetzen möchte. Aus diesem Grund brauche ich die Liste, mir ist keine bessere Idee eingefallen um auf die einzelnen Instanzen die ich automatisiert erzeuge Zugriff zu haben.

Das dies einen Klassenvariable ist, die ich erzeuge ist mir klar, da ich diese ja will. Habe ich übrigens (glaube ich) sogar im Tutorial gefunden.

Warum es nicht reproduzierbar ist, kann ich nicht sagen. Habe es erneut ausprobiert, tritt immer noch auf.
Erzeuge 2 Dateien.
Klassen.py und test.py
in Klassen.py steht:

Code: Alles auswählen

class test:
	Liste=[]
	def __init__(self):
		test.Liste.append(self)
und in test.py

Code: Alles auswählen


import Klassen
Klassen.test()
print len(Klassen.test.Liste)


Sobald ich Python/Idle komplett schliesse, habe ich das Problem nicht, nur wenn ich idle geöffnet habe und den Code mehrmals hintereinander ausführe, entsteht oben beschriebene Problem.
Gruss und Danke!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das ist ein typisches IDLE-Problem. Ich würde auf IDLE verzichten.

Zu deinem Problem allgemein: IMHO ist das ein ganz schlechtes OO-Design. Warum verwaltest du die Liste nicht außerhalb der Klasse?

Code: Alles auswählen

class Test(object):
    pass

instances = list()
instances.append(Test())
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Capucho2002 hat geschrieben:Sobald ich Python/Idle komplett schliesse, habe ich das Problem nicht, nur wenn ich idle geöffnet habe und den Code mehrmals hintereinander ausführe, entsteht oben beschriebene Problem.
Dann ist die Sache klar: Bei dir wird IDLE mit dem Parameter -n gestartet, d.h. "ohne Subprozess". Davon wird in der IDLE-Hilfe ausdrücklich abgeraten, weil genau so etwas dabei passiert. Wenn du IDLE im "normalen Modus" startest (also ohne -n), passiert das nicht.
Capucho2002
User
Beiträge: 5
Registriert: Mittwoch 30. Januar 2008, 16:57

OK,

danke für die Antwort. Werde mal nach ner alternative zu idle suchen.
Hat bis jetzt ja immer gereicht! :wink:

Werde deinen Vorschlag aufnehmen.
Was gutes und schlechtes OO-Design ist, kann man als "Einzelkämpfer" ohne Vorkenntnisse nur schwer wissen. Man ist ja schon froh, wenn es läuft!!
Aber dafür gibts ja Foren.

Gruss
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Capucho2002 hat geschrieben:Werde mal nach ner alternative zu idle suchen.
Hat bis jetzt ja immer gereicht!
Es gibt sicher gute Gründe für eine Alternative zu IDLE, aber wenn dich sonst nichts an IDLE stört, dann musst du nur dafür sorgen, dass IDLE nicht mit "-n" gestartet wird ...
Antworten