2014-10-11 3 views
0

Когда я продлеваю родительский класс, который имеет **kwargs, я не могу написать kwargs в super(ParentClass, self).__init__(args, kwargs). Почему так?Почему я не могу использовать ** kwargs

Код следующим образом: Первоначально я думаю, что это правильно, но это не так.

class Parent(object): 
    def __init__(self, *args, **kwargs): 
    pass 

class Child(Parent): 
    def __init__(self, *args, **kwargs): 
    super(Child, self).__init__(args, kwargs) 

Фактически, под ним сразу после проверки.

class Parent(object): 
    def __init__(self, *args, **kwargs): 
    pass 

class Child(Parent): 
    def __init__(self, *args, **kwargs): 
    super(Child, self).__init__(*args, **kwargs) 

Когда мы ссылаемся на ARG как *args, **kwargs, как правило, мы используем непосредственно args, kwargs. Почему здесь, когда я пишу __init__, я не могу этого сделать?

+0

Когда * вызывает * другую функцию, вы хотите повторно применить эти переменные (ключевое слово) и использовать аналогичный синтаксис. Это называется распаковкой аргументов. –

+0

Означает ли это, что мы не распаковываем в вызывающей функции? – evolever

+0

код примера не мой правый код .i его изменить. – evolever

ответ

0

Вы должны использовать

class Child(Parent): 
    def __init__(self, *args, **kwargs): 
    super(Child, self).__init__(*args, **kwargs) 

Для того, чтобы распаковать kwargs (и арг)

И ваш второй вопрос в том, что первый аргумент инициализации должен быть self который является экземпляром.

Когда вы делаете super(Child, self).something, вы в основном говорите, что мы вызываем something на родительский экземпляр.

Когда вы делаете __init__(*args, **args), первым аргументом является экземпляр (в вашем случае args[0]). Так что super(Child, self).__init__(*args[1:], **kwargs) работал бы, но лучше (лучше) использовать self, и это сработает.

+0

The OP (я думаю) спрашивайте * почему * это. Обратите внимание, что они уже * делают это в своем вопросе! –

+0

извините. я изменил это. мой вопрос не в том, что на самом деле. – evolever

+0

мой вопрос в том, когда мы вызываем другую функцию, мы используем фактический аргумент arg. например ** kwargs, я думаю, что kwargs является фактическим аргументом, почему мы не можем напрямую проходить здесь kwargs. – evolever

Смежные вопросы