Mehrfachvererbung in Python ist3 mit unterschiedlichen Signaturen

Habe ich drei Klassen: A, B und C.

C erbt von A und B (in dieser Reihenfolge). Die Konstruktor-Signaturen von A und B unterschiedlich sind. Wie kann ich rufen Sie die __init__ Methoden der übergeordneten Klassen?

Mein bemühen in code:

class A(object):
    def __init__(self, a, b):
        super(A, self).__init__()
        print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))

class B(object):
    def __init__(self, q):
        super(B, self).__init__()
        print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))

class C(A, B):
    def __init__(self):
        super(A, self).__init__(1, 2)
        super(B, self).__init__(3)

c = C()

ergibt den Fehler:

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    c = C()
  File "test.py", line 13, in __init__
    super(A, self).__init__(1, 2)
TypeError: __init__() takes 2 positional arguments but 3 were given

Fand ich diese Ressource die erklärt, multiple Vererbung mit unterschiedlichen Argumenten, aber Sie schlagen die Verwendung *args und **kwargs für alle argument. Ich halte dies für sehr hässlich, da kann ich nicht sehen, aus dem Konstruktor-Aufruf in der Kind-Klasse, welche Parameter ich übergeben, um die übergeordneten Klassen.

  • Sie sind mit super falsch, das sollte genauso sein super(C, self).__init__ im C.__init__. Als Sie haben unterschiedliche Signaturen, haben Sie keine Wahl, sondern handle willkürlich *args, **kwargs wenn Sie verwenden möchten super.
  • super() ist, wenn Sie aus der Verwendung von Mixins in Verbindung. Nicht verwenden, wenn Sie verschiedene Signaturen.
Schreibe einen Kommentar