Kann ich mit einer Mixinklasse ein benanntes Schlüsselwort zur Signatur einer Funktion in der Basis hinzufügen? Im Moment kann ich nicht herausfinden, wie die Unterschrift des Basisfunktionsüberschreiben zu vermeiden:Hinzufügen eines benannten Schlüsselworts zu einer Funktionssignatur
from inspect import signature
class Base(object):
def __init__(self, foo='bar', **kwargs):
pass
class Mixin(base):
def __init__(self, foo2='bar2', **kwargs):
super(Mixin, self).__init__(**kwargs)
class P(Mixin, Base):
pass
print(signature(P.__init__))
# Output: (self, foo2='bar2', **kwargs)
$ Desired output: (self, foo1='bar1', foo2='bar2', **kwargs)
bearbeiten Danke für die Antworten bisher leider muss ich tatsächlich den benannten Parameter an die Funktion Signatur hinzuzufügen, während Außerdem werden die benannten Parameter von der ursprünglichen Basisfunktionssignatur beibehalten (und diese variieren abhängig von der Basis). Der Grund ist, dass die signature
is used elsewhere for intraspection to extract the parameter names.: Wird dies in der __init__
Methode möglich sein? Hier
ist eine (schreckliche) Teillösung, die die Unterschrift auf Instanzen ändert, aber nicht auf die Klasse selbst, auch ist es **kwargs
aus irgendeinem Grund fehlt:
class Mixin(Base):
def __init__(self, foo2='bar2', **kwargs):
super(Mixin, self).__init__(**kwargs)
sig = signature(super(Mixin, self).__init__)
params = {k:v.default for k,v in sig.parameters.items() if v.default != _empty}
params['foo2'] = 'bar2'
argstring = ",".join("{}='{}'".format(k,v) for k,v in params.items())
exec("def new_init({}, **kwargs): self.__init__(**kwargs)".format(argstring))
self.__init__ = new_init
class P(Mixin, Base):
pass
p = P()
print(signature(p.__init__))
# (foo2='bar2', foo='bar')
Sie nicht die Basis Signatur zu überschreiben vermeiden, können Sie überschreibe die ganze Sache. – jonrsharpe