Override Class.__init__ in Subclass

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.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Override Class.__init__ in Subclass

Beitragvon droptix » Sonntag 1. Juli 2007, 10:05

Habe eine Baseclass, die im Konstruktor zwei Argumente erwartet. Das zweite Argument ist optional. Beispiel:

Code: Alles auswählen

class A:
    def __init__(self, spam, eggs=None):
        print spam, eggs


Dann gibt's eine Subclass, die eigentlich genau wie die Baseclass aufgebaut ist, bei der aber das zweite Argument im Konstruktor immer `None` sein muss. Daher möchte ich verhindern, dass man beim Initialisieren des Objekts ein zweites Argument angeben kann.

Ich möchte aber nicht den ganzen Konstruktor neu schreiben, sondern den der Basesclass aufrufen, nur eben mit einem Argument. Ich dachte an sowas hier, aber das ruft den Konstruktor unendlich oft auf:

Code: Alles auswählen

class B(A):
    # override constructor, `eggs` cannot be specified
    def __init__(self, spam):
        self.__init__(spam)


Wie realisiert man das am besten?

P.S. Nun könnte man ja im Anschluss `eggs` trotzdem noch überschreiben. Kann ich das verhindern, indem ich sowas wie eine "protected" Variable benutze, die von der Subclass nicht überschreibbar ist`, also z.B. `__eggs` (ich weiß, überschreiben ginge dann noch durch `B._B__eggs`)?
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Sonntag 1. Juli 2007, 10:14

Hi doptix,

das war haargenau mein Problem
http://www.python-forum.de/topic-10923.html?highlight=
. Du darfst natürlich nicht den Konstruktor von self aufrufen, da der logischerweise nur den der abgeleiteten Klasse enthält. Du musst den der Basisklasse aufrufen und die Referenz auf sich selbst übergeben:

Code: Alles auswählen

class B(A):
    # override constructor, `eggs` cannot be specified
    def __init__(self, spam):
        A.__init__(self, spam)


Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Sonntag 1. Juli 2007, 12:45

Aaaah, danke!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder