Seite 1 von 1

Erben von object

Verfasst: Freitag 19. Februar 2010, 16:35
von Thalisanna
Ich vermute, das was ich wissen will ist eine zimelich dämliche frage, wenn man sich mit Oython auskennt, aber ich tu es nun mal nicht :oops:

Also: Ich möchte mir eine klasse vom object ererben. Ich weiß in der auch, wie es geht, nur komme ich von delphi und da muss ich für die reservierung des speicherplatzes und sein Löschen wenn ich den Konstruktor/Destruktor überschreibe den vorigen aufrufen.
Muss ich das bei Python? in der theorie wäre das ja object.__init/del__ (hoffe ich :oops: )

und direkt angehängt noch die Frage: Kann ich eine Liste erstellen, wo alle speicherplätze leer sind? Gibt es überhaupt so etwas wie leere Variablen in Python?

Verfasst: Freitag 19. Februar 2010, 16:42
von DasIch
Python hat nicht den Konstruktor und das __del__ existiert vergisst du besser gleich wieder. Es macht natürlich unter Umständen Sinn __init__ der Superklasse aufzurufen aber dass musst du nicht.

Soetwas wie leere Variablen gibt es in Python nicht, Referenzen sind nur dazu da um auf Objekte zuzugreifen, einen anderen Zweck haben sie nicht.

Verfasst: Freitag 19. Februar 2010, 16:53
von BlackJack
@Thalisanna: Du kannst Listen mit Platzhaltern für "leere" Objekte erstellen, zum Beispiel mit `None`. *Aber* so etwas wie "leere" Listen mit einer bestimmten Länge erstellen und die dann zu befüllen, in dem man Schleifen mit Indexvariablen verwendet, ist in Python eher ungewöhnlich. Man kann direkt über die Elemente von Listen iterieren und Listen per "list comprehension" oder durch Anhängen von Elementen an eine Liste aufbauen. Das sind in Python relativ günstige Operationen was die Laufzeit angeht. Indexvariablen solltest Du als "code smell" ansehen und Dich fragen ob Du das nur so machst, weil man das in Delphi halt so machen muss.

Die Speicherverwaltung wird Dir von Python abgenommen. Da brauchst Du in der Regel nicht viel drüber nachdenken.

Verfasst: Freitag 19. Februar 2010, 16:56
von Thalisanna
Danke vielmals dafür :D


Aber mein Problem mit dem Destruktor bleibt (oder erweitert sich sogar...)
Also eine nähere beschreibung:
Ich muss im destruktor wieder ein rectangle vom canvas löschen. mit welchen befehl mach ich das denn? Also im allgemeinen für solche zeichnungen, msste ja bei ovalen das selbe sein

Verfasst: Freitag 19. Februar 2010, 17:14
von DasIch
Thalisanna hat geschrieben:Ich muss im destruktor wieder ein rectangle vom canvas löschen. mit welchen befehl mach ich das denn? Also im allgemeinen für solche zeichnungen, msste ja bei ovalen das selbe sein
Du solltest __del__ auf keinen Fall für soetwas benutzen. __del__ ist nicht vergleichbar mit Destruktoren in anderen Sprachen und sollte im besten Falle gar nicht verwendet werden.

Ich würde dem Rectangle eine remove_from_canvas Methode verpassen die du aufrufst.

Verfasst: Freitag 19. Februar 2010, 17:19
von Thalisanna
Ich erstelle gerne eine andere Methode (wobei ich dann nicht weiß, wozu __del__ gut ist)
aber ich weiß den namensaufruf nicht. Also erstellen tu ich es ja mit
c.create_rectangle(....) insofern c eine Canvaskomponente ist
jetzt will ich das ding aber ja nicht mehr auf meinem Canvas haben, wie also ist der aufruf dafür? vermutlich auch c. irgendwas

Verfasst: Freitag 19. Februar 2010, 18:11
von BlackJack
@Thalisanna: `__del__()` ist in Python im Grunde zu gar nichts gut. Entwurfsfehler in der Sprache. Haben die bei Java auch gemacht -- da heisst's IIRC `finalize()`.

`Canvas.delete()` ist was Du suchst. Und dann halt entweder Tags oder die ID, die der `create_*()`-Aufruf lieferte, übergeben. Such Dir am besten eine gute Tk/Tkinter-Doku.

Verfasst: Freitag 19. Februar 2010, 18:56
von Thalisanna
Ich glaube, es liegt nicht unbedingt an der Dokumentation, sondern eher an meinem Unverständnis eben dieser, denn delete hatte ich sogar :oops:

In jedem Fall danke ich jedem, der mir hier geholfen hat, es hat wirklich was gebracht :wink: