Seite 1 von 1

Override Class.__init__ in Subclass

Verfasst: Sonntag 1. Juli 2007, 10:05
von droptix
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`)?

Verfasst: Sonntag 1. Juli 2007, 10:14
von Michael Schneider
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

Verfasst: Sonntag 1. Juli 2007, 12:45
von droptix
Aaaah, danke!