Podklasyję obiekt, aby nadpisać metodę, do której chcę dodać jakąś funkcjonalność. Nie chcę całkowicie zastąpić go lub dodać inaczej nazwanej metody, ale pozostać kompatybilnym z metodą superklasy przez dodanie opcjonalnego argumentu do metody. Czy można pracować z *args
i **kwargs
przechodzić przez wszystkie argumenty do nadklasy i nadal dodawać opcjonalny argument z domyślnym? intuicyjnie wymyślił następujące ale to nie działa:dodanie argumentu ze słowem kluczowym do przesłoniętej metody i użycie ** kwarg
class A(object):
def foo(self, arg1, arg2, argopt1="bar"):
print arg1, arg2, argopt1
class B(A):
def foo(self, *args, argopt2="foo", **kwargs):
print argopt2
A.foo(self, *args, **kwargs)
b = B()
b.foo("a", "b", argopt2="foo")
Oczywiście mogę zmusić go do pracy, kiedy jawnie dodać wszystkie argumenty metody nadklasy:
class B(A):
def foo(self, arg1, arg2, argopt1="foo", argopt2="bar"):
print argopt2
A.foo(self, arg1, arg2, argopt1=argopt1)
Jaki jest właściwy sposób, aby to zrobić, czy muszę wiedzieć i jawnie podać wszystkie przesłonięte argumenty metod?
Możesz użyć pop zamiast get + del. – iny
Zawsze zapominam o dict.pop! –
Twój przykład kończy się niepowodzeniem z 'KeyError', gdy' argopt2' nie jest przekazywane. Użycie 'kwargs.pop ('argopt2', default_for_argopt2)' jest najprostszym sposobem, aby to naprawić. –