Решение *args, **kwds
, представленное @Acorn, является хорошим началом (хотя я не согласен с частью ответа *args
).Этот подход представлен с рядом уточнений в статье: Супер Считается Супер * .
в Python. Не рекомендуется использовать *args
, потому что он не позволяет вставлять новыеклассы в иерархии, и это не позволяет подклассам использовать множественное наследование с другими классами, которые могут иметь несовместимые позиционные аргументы.Подход **kwds
работает намного лучше, потому что он не навязывает определенный порядок цепочки вызовов.
Также обратите внимание, что вы можете использовать именованные аргументы для разделения и удаления именованных аргументов текущего метода из остальной частиАргументы ключевых слов перед передачей по цепочке:
class Bar(object):
def __init__(self, arg1=None, arg2=None, argN=None):
print arg1, arg2, argN
class Foo(Bar):
def __init__(self, my_new_arg=None, **kwds):
super(Foo, self).__init__(**kwds)
self.new_arg = my_new_arg
print my_new_arg
f = Foo(my_new_arg='x', arg2='y')
Важно, чтобы каждый метод отбирал необходимые ему аргументы, поскольку родительский метод, такой как object .__ init __ не ожидает никаких аргументов.
Последнее замечание: если вы собираетесь использовать super , убедитесь, что ваш самый верхний класс в новом стиле(т.е. он наследует от объекта или другого встроенного типа).