Вы получили это. Если вы не используете bar
/ baz
, не принимайте их, просто передайте их как часть args
/ kwargs
, не разбираясь с ними самостоятельно.
A Полуофициальная рекомендация (см. раздел «Практические советы»), особенно в более сложных сценариях наследования ios, заключается в том, чтобы вообще не принимать *args
(за исключением случаев, когда вам действительно нужно принимать переменные позиционные аргументы, а скорее чем лень не указывать известное фиксированное число аргументов, требуемое вашими родителями), и пусть каждый слой принимает только:
- Аргументы, которые они используют, и
- Аргументы произвольных ключевых слов (
**kwargs
)
Причина этого заключается в том, что:
- Позиционные аргументы могут изменять позицию при изменении иерархии
- Это становится невероятно уродливым окончательный порядок позиционных аргументов, когда задействовано множественное наследование (или, что еще хуже, алмазное наследование)
Требуется передать все аргументы по ключевому слову: l Это на медленнее, но это тривиально в накладных расходах на много вызовов через super()
диспетчеризацию, и очень ясно, какие аргументы передаются и не передаются. Поэтому для своего кода вы просто должны сделать:
class A:
def foo(self, bar, baz=None, **kwargs):
... # Do some stuff with using bar, baz, and kwargs
return result
class B(A):
def foo(self, **kwargs):
... # Not using bar or baz
return super().foo(**kwargs)
class C(A):
# ... same as B aside from omitted code
с вызывающими абонентами, звонящими по номеру:
instance.foo(bar=1)
instance.foo(bar=2, baz=3)
или т.п.