ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
2456
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Avatar von Enumerator
    Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Hi!

    Aus Spaß an der Freude dacht' ich mir heute zum Feierabend: "...was soll's? Lernst' halt Python..".
    Bin auch recht fix voran gekommen, allerdings bereitet mir die OOP etwas Kopfzerbrechen: Vielleicht kann mir jemand mal erklären warum im folgenden der (vererbte) Destruktor der Klasse "Person" nicht aufgerufen wird?
    Bzw. warum Sätze wie "John Lennon stirbt." und "Ringo Starr lebt aber noch!" nicht ausgegeben werden?
    Code Python:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    #!/usr/bin/env python
    # coding=UTF-8
     
    import sys
    echo = sys.stdout.write
     
    class Person:
        def __init__(self, name):
            self.name = name
            print self.__class__._Artikel, self.__class__.__name__, self.name, self.__class__._Entsteht
        def __del__(self):
            print self.__class__._Artikel, self.__class__.__name__, self.name, self.__class__._Verschwindet
        def sagt(self, nachricht):
            sys.stdout.write(self.name)
            print "sagt:", nachricht
     
    Person._Entsteht = "entsteht."
    Person._Verschwindet = "veschwindet."
    Person._Artikel = "Die"
     
    class Mensch(Person):
        def __del__(self):
            print self.name, "geht's nicht gut..."
    #       Person.__del__(self)
     
    Mensch._Entsteht = "wird geboren."
    Mensch._Verschwindet = "stirbt."
    Mensch._Artikel = "Der"
     
    class Musiker(Mensch):
        pass
     
    namen = [ "Stuart Sutcliffe", "Ringo Starr", "John Lennon", "Pete Best",
        "Paul McCartney", "George Harrison" ]
    musiker = {}
     
    for iter in range(len(namen)):
        musiker[namen[iter]] = Musiker(namen[iter])
     
    reihenfolge = (0, 2, -1)
     
    for iter in reihenfolge:
        del musiker[namen[iter]]
     
    Mensch._Verschwindet = "lebt aber noch!"
    Die auskommentierte Zeile 24 wirft einen sehr abenteuerlichen Fehler den ich zwar verstehe --
    dennoch überrascht es mich das das nicht die Lösung des o.g. Problems ist, zumal es im Konstruktor funktioniert..

    Dank und Gruß
    Enum
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.785
    Zitat Zitat von Enumerator Beitrag anzeigen
    Bin auch recht fix voran gekommen, allerdings bereitet mir die OOP etwas Kopfzerbrechen: Vielleicht kann mir jemand mal erklären warum im folgenden der (vererbte) Destruktor der Klasse "Person" nicht aufgerufen wird?
    Bzw. warum Sätze wie "John Lennon stirbt." und "Ringo Starr lebt aber noch!" nicht ausgegeben werden?
    Weil die Semantik von __del__ nun mal so ist (Quelle).

    Zitat Zitat von Enumerator Beitrag anzeigen
    Die auskommentierte Zeile 24 wirft einen sehr abenteuerlichen Fehler den ich zwar verstehe --
    dennoch überrascht es mich das das nicht die Lösung des o.g. Problems ist, zumal es im Konstruktor funktioniert..
    Ich kann im Konstruktor keinen zu Person.__del__(self) äquivalenten Aufruf erkennen. Was genau meinst du damit? __del__ entspricht (nicht nur in dieser Hinsicht) übrigens nicht dem Destruktor aus bspw. C++. Es wird nämlich nicht mal garantiert, dass die Methode beim Skriptende für alle noch lebenden Objekte aufgerufen wird. In den meisten Fällen braucht man aber Destruktoren in einer Sprache mit einem GC auch überhaupt nicht.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”

  3. #3
    Avatar von Enumerator
    Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Hi Matthias!

    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    Ich kann im Konstruktor keinen zu Person.__del__(self) äquivalenten Aufruf erkennen.
    Sorry, ich hatte zuvor im Skript eine weitere Klasse:
    Code Python:
    1
    2
    3
    4
    5
    
    class Gruppe(Person):
        def __init__(self, name):
            Person.__init__(self, name)
            self.mitglieder = []
    # ...

    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    Was genau meinst du damit? __del__ entspricht (nicht nur in dieser Hinsicht) übrigens nicht dem Destruktor aus bspw. C++. Es wird nämlich nicht mal garantiert, dass die Methode beim Skriptende für alle noch lebenden Objekte aufgerufen wird. In den meisten Fällen braucht man aber Destruktoren in einer Sprache mit einem GC auch überhaupt nicht.
    Kein Zweifel. Dennoch ist es IMHO wichtig, das Verhalten des GC genau zu kennen, u.A. um mit (weak-) Referenzen und Dergleichen sowie C-modulen sicher spielen zu können.
    In diesem speziellen Fall wollte ich eigentlich nur in Erfahrung bringen, wann genau welcher Destruktor aufgerufen wird: Wenn z.B. die Klasse Gruppe das einzige Objekt ist welches überhaupt Referenzen zu bestimmten Personen hält ist es doch sehr wichtig, ob zuerst die Destruktoren der Person Klasse (für die Mitglieder) aufgerufen werden oder erst die Gruppe vernichtet wird...
    Wie auch immer, die gestellten Fragen hat das Skript für mich ja beantwortet. Nur hat es auch eine neue Frage aufgeworfen - und die ist Thema dieses Threads

    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    Weil die Semantik von __del__ nun mal so ist (Quelle).
    Ok. Wie zur H*lle kann ich dann ein solches verhalten implementieren? Tante Google hat zwar ein paar Tweaks ausgespuckt (so in der Richtung for base in self.__class__.__bases__) aber keine davon scheint wirklich sicher, schon gar nicht wenn weitere Ableitungen vorgenommen werden -
    Und soweit mich meine Englisch-Kenntnisse bringen, beschreibt die Doku die Du verlinkt hast auch nur das Problem und nicht die Lösung...

    Gruß
    Enum
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

Thema nicht erledigt

Ähnliche Themen

  1. [Python] Script ( .py ) aus Python Kommandozeile (python.exe) heraus öffnen
    Von Hookah im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 0
    Letzter Beitrag: 16.12.09, 10:59
  2. Klasse wo aufrufen?
    Von snowleopard im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 17.11.09, 00:24
  3. Funktion aus übergeordneter Klasse starten
    Von Rici im Forum Java Grundlagen
    Antworten: 2
    Letzter Beitrag: 14.08.08, 22:06
  4. Destruktor direkt aufrufen
    Von sheel im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 16.11.07, 09:06
  5. Antworten: 6
    Letzter Beitrag: 19.11.06, 17:34