der destruktor bei der OOP

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
cyberangle
User
Beiträge: 19
Registriert: Freitag 30. Oktober 2020, 09:39

Hallo zusammen,

ich lerne Python und bin in meinem Buch bei der opjektorientierten Programmierung.

Da speziell bei dem Konstruktor und Destruktor.
Beim Konstuktor funktioniert die Progammierung wie in Buch beschrieben, aber bein Destuktor nicht.
Beim Aufruf des Destuktor um eine Opjekt zu löschen wird dieses auch entfernt, aber am Programmende
werden alle restlichen Obekte auch entfernt sodas alle Objekte gelöscht sind.

Im ganzen Programmtext erscheint aber nur 1 Mal der Befehl zum Aufruf zur Methodes
>>> del porsche
lt. meinem Buch sollte dann auch nur das eine Objekt gelöscht werden und nicht am Programmende auch noch der
Rest.

Weis einer von Euch Rat???
Vielen Dank
cyberagle
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich hoffe das Buch hat einen guten Brennwert. In Python von Konstruktoren und Destruktoren zu reden, ist etwas ungenau. Es gibt eine Methode __init__ zum Initialisieren von Objekten und eine Methode __del__ die beim Abräumen des Objekts durch den Garbage-Collector aufgerufen wird. Da am Ende des Programms alle Objekte abgeräumt werden, wird diese Methode natürlich immer aufgerufen.
Das `del`-Statement hat nichts mit dem Löschen eines Objekts zu tun, das kannst Du nämlich gar nicht. `del` entfernt nur einen Namen aus dem aktuellen Namespace. Da das Löschen eines Namens selten Sinn macht, benutzt man del so gut wie nie.
cyberangle
User
Beiträge: 19
Registriert: Freitag 30. Oktober 2020, 09:39

Danke, damit hast Du mir schon geholfen, denn genau um __del__ ging es. Im Buch stand nicht, dass am Ende dess Programmes alle Objekte
abgeräumt werden. Für jedes Objekt kam die Meldung Objekt gelöscht.
Vielen Dank
cyberagle
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@cyberangle: Es ist nicht garantiert, dass am Ende des Programms die `__del__`-Methode aller Objekte aufgerufen wird:

Code: Alles auswählen

class Foo:
    def __init__(self):
        print("Foo.__init__()")

    def __del__(self):
        print("Foo.__del__()")


Foo()
Ergibt

Code: Alles auswählen

$ pypy3 t.py
Foo.__init__()
Es ist in jeder Hinsicht optional, dass `__del__` aufgerufen wird. Da darf man sich nicht drauf verlassen.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Als Ergänzung: Darum gibt es ``with`` und Kontextmanager falls man garantiert Ressourcen aufräumen will/muss. Wenn man also den Drang verspürt `__del__()` zu implementieren, sollte man in aller Regel eher `__enter__()` und `__exit__()` implementieren oder eine Methode oder Funktion mit `contextlib.contextmanager()` dekorieren.

`__del__()` kann, wenn man auf die Gefahren achtet, in einigen wenigen Fällen sinnvoll sein, in denen man externe Ressourcen freigeben möchte und Kontextmanager nicht in Frage kommen. Ich glaube ich habe das bisher nur für eine handvoll Fälle mit externen C-APIs gebraucht die ich mit `ctypes` angebunden habe. Also nichts was irgendwie zu den Grundlagen von Python-Programmierung gehören würde.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Handelt es sich einmal mehr um das Buch von Ernesti/Kaiser?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Python Dokumentation geht auf die ganzen Probleme mit __del__ ziemlich gut ein https://docs.python.org/3/reference/dat ... ject.__del__.

Was die Dokumentation nicht erwähnt ist dass sich die Konsequenzen davon __del__ zu implementieren im Laufe der Zeit geändert haben auch zwischen unterschiedlichen Minor Versionen. Es war z.B. mal möglich das __del__ mehrfach auf dem selben Objekt aufgerufen wird oder dass __del__ zu Memory Leaks führt.

Selbst wenn man das notwendige Wissen hat um __del__ richtig zu implementieren, ist es sehr schwer dies ohne Fehler richtig hinzubekommen, vor allem weil man es nicht wirklich testen kann. Das notwendige Wissen haben allerdings auch sehr erfahrene und gute Python Entwickler i.d.R. nicht. Man muss schon viel über die Implementation(en) selbst wissen um wirklich zu verstehen was da passiert und was man bedenken muss.
cyberangle
User
Beiträge: 19
Registriert: Freitag 30. Oktober 2020, 09:39

Sorry hatte eine Woche keine Zeit

Hallo Sparrow dasBuch ist von Rheinwerk Computing v on Thomas Theis Einstieg in Python
Vielen Dank
cyberagle
Benutzeravatar
snafu
User
Beiträge: 6870
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

cyberangle hat geschrieben: Mittwoch 23. Dezember 2020, 11:43 dasBuch ist von Rheinwerk Computing v on Thomas Theis Einstieg in Python
Das ist ein sehr beliebtes Buch bei Anfängern. Andererseits ist es schon in mehreren Punkten durch größere Fehler aufgefallen, weil es Dinge beschreibt, die man so nicht in typischen Python-Programmen machen würden, sondern eher in Sprachen wie Java. Es steht nicht nur Müll drin, aber gerade das Thema OOP ist darin mit Vorsicht zu genießen.
Antworten