Могу ли я передать python ** kwargs родительскому классу из подпрограммы?

Я хотел бы сделать что-то вроде этого:

class A(object):
    def __init__(self, **kwargs):
       """ 
       return exception if certain arguments not set
       """

class B(A):
    def __init__(self, **kwargs):
       super(B, self).__init__(**kwargs)

По сути, каждый подкласс потребует правильного создания экземпляров определенных аргументов. Это одни и те же параметры по всем направлениям. Я хочу только один раз проверить эти аргументы. Если я могу сделать это из родительского init() - тем лучше.

Можно ли сделать это?


person doremi    schedule 15.01.2013    source источник


Ответы (2)


Конечно. Это не редкость:

class A(object):
    def __init__(self, foo, bar=3):
        self.foo = foo
        self.bar = bar

class B(A):
    def __init__(self, quux=6, **kwargs):
        super(B, self).__init__(**kwargs)

        self.quux = quux

B(foo=1, quux=4)

Это также немного изолирует вас от super махинаций: теперь argspec A может изменяться без каких-либо правок в B, и бриллиантовое наследование с меньшей вероятностью сломается.

person Eevee    schedule 15.01.2013
comment
Обратите внимание, что вы можете создать экземпляр объекта A с помощью A(1,3), но вы не можете создать экземпляр объекта B с помощью B(1,3) или даже B(1,3,4). - person Brian B; 05.01.2018

Абсолютно. Расширение параметров и ключевых слов будет работать естественным образом, если они будут переданы в аргументы параметров и ключевых слов.

person Ignacio Vazquez-Abrams    schedule 15.01.2013