Vermixte Namensräume?

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
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi,

vermutlich übersehe ich eine ganz dumme Kleinigkeit.

Wenn ich eine Instanz meiner abgeleiteten Exception erzeugen möchte, die bei ihrer Initialisierung eine Funktion aufruft, welche es unter demselben Namen in der Basisklasse bereits gibt, dann ruft die Basisklasse scheinbar diese Funktion in der abgeleiteten Klasse auf. Ich dachte immer, dass die Namensräume zumindest soweit abgeschlossen sind, dass die Basisklasse nicht die Funktion der Kinderklasse aufrufen kann. Hier der Code:

Code: Alles auswählen

class BaseException:
    def __init__(self, s=""):
        self._init_superclass()

    def _init_superclass(self):
        print "Initialisierung der Basisklasse"

class DerivedException(BaseException):
    def __init__(self, s=""):
        self._init_superclass()

    def _init_superclass(self):
        BaseException.__init__(self)

DE = DerivedException()
... und meine Fehlermeldung:
...
File "C:\Python24\quicktest38.py", line 13, in _init_superclass
BaseException.__init__(self)
File "C:\Python24\quicktest38.py", line 3, in __init__
self._init_superclass()
File "C:\Python24\quicktest38.py", line 13, in _init_superclass
BaseException.__init__(self)
File "C:\Python24\quicktest38.py", line 3, in __init__
self._init_superclass()
File "C:\Python24\quicktest38.py", line 13, in _init_superclass
BaseException.__init__(self)
RuntimeError: maximum recursion depth exceeded
Kennt wer mein Problem?

Vielen Dank schonmal,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das ist doch genau das, was man erwarten würde und was auch sinnvoll ist...

Warum würde man das erwarten? Von Pythons Sicht aus: `self` ist ein Objekt der Klasse `DerivedException`. Rufst du darauf die Methode `_init_superclass` auf, wird natürlich die von `DerivedException` verwendet.
dann ruft die Basisklasse scheinbar diese Funktion in der abgeleiteten Klasse auf
Nicht die Klasse ruft etwas auf. Du rufst eine Methode eines Objekts auf, zufälligerweise innerhalb einer Methode der Basisklasse.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Aha,

das klingt plausibel. Also muss ich in der Basisklasse die Klassenmethode per

Code: Alles auswählen

BaseException._init_superclass(self)
aufrufen? Darauf muss man erstmal kommen. Aber Du hast recht, sobald die Basisklasse abgeleitet wird, wird auch die Instanzmethode überschrieben.

Ich wusste doch, dass es eine dumme Kleinigkeit ist. :-)

Vielen Dank nochmal für die Klärung,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten