Hinzufügen von optionalen Parametern zu den Konstruktoren von mehrfach vererbten Unterklassen von eingebauten Typen?

Meine Mehrfachvererbung ist nicht stark. Ich versuche, eine Superklasse zu erstellen, deren __init__ einen optionalen benannten Parameter und Unterklassen davon enthält, die auch von eingebauten Typen erben. Leider scheine ich keine Ahnung zu haben, wie man diese Arbeit macht:

 >>> class Super(object): name = None def __init__(self, *args, name=None, **kwargs): self.name = name super().__init__(self, *args, **kwargs) >>> class Sub(Super, int): pass >>> Sub(5) 5 >>> Sub(5, name="Foo") Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> Sub(5, name="Foo") TypeError: 'name' is an invalid keyword argument for this function 

(Ich habe es auch ohne den super() Anruf ausprobiert, aber das Ergebnis war dasselbe.)

Vielleicht kann jemand mit besserer Kenntnis der Mehrfachvererbung mich in die richtige Richtung zeigen?

Aktualisieren:

Hier ist die Lösung, die ich am Ende hatte, basierend auf Alex's Antwort .

Es ist immer noch ein bisschen hackig (indem ich __new__ 's Signatur teilweise durch den Bau ändert), aber es wird so lange funktionieren, wie die Superklasse in den Unterklassen-MROs vor dem eingebauten Typ erscheint und definiert __new__ diese Weise ermöglicht es mir, Unterklassen zu __new__ , die funktionieren Mit verschiedenen eingebauten Typen ohne Hinzufügen eines separaten __new__ zu jedem.

 >>> class Super(object): name = None def __new__(cls, *args, name=None, **kwargs): inner = super().__new__(cls, *args, **kwargs) inner.name = name return inner >>> class Sub(Super, int): pass >>> Sub(5) 5 >>> Sub(5, name="Foo") 5 >>> _.name 'Foo' 

One Solution collect form web for “Hinzufügen von optionalen Parametern zu den Konstruktoren von mehrfach vererbten Unterklassen von eingebauten Typen?”

Sie können einfach keine willkürlichen Parameter (ob Position oder benannte) auf eine ebenso beliebige Superklasse (dh "unmittelbar vorheriger Typ im mro was auch immer der aktuelle mro ist") – die meisten Typen und Klassen akzeptieren nur keine willkürlichen Parameter , Aus guten Gründen auch – zitiert aus der Mitte des Zen of Python ,

 Errors should never pass silently. Unless explicitly silenced. 

Und in den meisten Fällen würde das Aufrufen (zB) int(name='booga') natürlich ein Fehler sein.

Wenn du willst, dass du seltsam benannte class Super in der Lage bist, "beliebige Parameter" weiterzugeben, musst du auch dafür sorgen, dass alle Klassen, die jemals als Basen verwendet werden, nachdem sie damit umgehen können – also zB int mit einem Parameter aufgerufen werden kann (Oder genau zwei: ein String und eine Basis), also, wenn es absolut entscheidend für dich ist, dass class Sub multiplizieren kann von dem Buck-Passing Super und Int zu erben, musst du das, zB:

 class Int(int): def __new__(cls, *a, **k): return int.__new__(Int, a[0] if a else 0) 

Beachten Sie, dass Sie __new__ überschreiben __new__ , nicht __init__ (es schadet nicht, wenn Sie auch das letztere überschreiben, aber es ist sowieso irrelevant): int ist unveränderlich, also muss der Wert auf __new__ time gesetzt werden.

Nun , Dinge wie

 >>> class X(Super, Int): pass ... >>> X(23, za='zo') 23 >>> 

Arbeit. Aber __new__ , dass X von Int (unsere __new__ -sanitizing Version von int ) __new__ muss, nicht von int selbst, was ganz richtig ein unversöhnliches __new__ !)

  • Mit Sin-1 oder inverser Sünde in Python
  • Verständnis * x, = lst [duplizieren]
  • Gibt es irgendeine Möglichkeit, die Einheimischen zur Laufzeit zu beeinflussen?
  • Erweiterungsliste gibt keine zurück
  • Negative Null in Python
  • Wie man Bytes zu einer Datei in Python 3 schreibt, ohne die Codierung zu kennen?
  • Lernen über Warteschlangenmodul in Python (wie man es ausführt)
  • Pythonschleife durch String in verschachtelten Schlaufen
  • Python3 - Lernen über die Suche, dieses sehr einfache Beispiel funktioniert nicht richtig
  • Generiere einen zufälligen Brief in Python
  • Wie kann ich ein "Enum" in Python darstellen?
  • Python ist die beste Programmiersprache der Welt.