Wie kann ich die __init__
eine Basisklasse erweitern, mehr Argumente in dem, ohne super().__init__(foo, bar)
erfordern in jeder abgeleiteten Klasse analysiert werden?Weitere Argumente in abgeleiteten Klasse __init__ als Basisklasse __init__
class Ipsum:
""" A base ipsum instance. """
def __init__(self, foo, bar):
self.foo = flonk(foo)
grungole(self, bar)
self._baz = make_the_baz()
class LoremIpsum(Ipsum):
""" A more refined ipsum that also lorems. """
def __init__(self, foo, bar, dolor, sit, amet):
super().__init__(foo, bar)
farnark(sit, self, amet)
self.wibble(dolor)
Der Zweck des Beispiels zu zeigen, dass es erhebliche Verarbeitung in den Ipsum.__init__
passiert ist, so sollte es nicht in jeder Unterklasse dupliziert werden; und die LoremIpsum.__init__
benötigt die foo
und bar
Parameter genauso verarbeitet wie Ipsum
, hat aber auch ihre eigenen speziellen Parameter.
Es zeigt auch, dass, wenn Ipsum
Bedarf eine andere Signatur, jede abgeleiteten Klasse auch nicht nur seine Unterschrift ändern muss akzeptieren geändert werden, aber wie nennt es die übergeordnete Klasse __init__
. Das ist inakzeptabel fragil.
Stattdessen würde Ich mag, wie etwas zu tun ist:
class Ipsum:
""" A base ipsum instance. """
def __init__(self, foo, bar, **kwargs):
self.foo = flonk(foo)
grungole(self, bar)
self._baz = make_the_baz()
self.parse_init_kwargs(kwargs)
def parse_init_kwargs(self, kwargs):
""" Parse the remaining kwargs to `__init__`. """
pass
class LoremIpsum(Ipsum):
""" A more refined ipsum that also lorems. """
def parse_init_kwargs(self, kwargs):
(dolor, sit, amet) = (kwargs['dolor'], kwargs['sit'], kwargs['amet'])
farnark(sit, self, amet)
self.wibble(dolor)
, die den großen Vorteil hat, dass LoremIpsum
brauchen nur die Teile tun, die zu dieser Klasse etwas Besonderes sind; Handhabung Ipsum
Argumente wird von dieser Klasse __init__
ohne zusätzlichen Code behandelt.
Der Nachteil ist jedoch offensichtlich: Dies ist effektiv die Umsetzung der benannten Parameter durch die Übergabe eines Wörterbuchs um implementieren. Es vermeidet viel Wiederholung, ist aber nicht sehr klar.
Welche Tools verfügbar sind, um die Unterklassendefinitionen zu vermeiden immer benötigen die foo
und bar
Parameter zu erklären, und immer benötigen super().__init__(foo, bar)
anrufen? Die sind leicht zu bekommen, so dass es besser wäre, wenn sie nicht benötigt würden und einfach automatisch passieren könnten, während immer noch LoremIpsum
Anpassung der Initialisierung.
Wahrscheinlich ist es hier keine gute Idee, '* args' zu übergeben. Die Argumente können sich ändern und viel Verwirrung stiften. Sollte stattdessen Kwargs verwenden. –