如何在python中创建使用**(双星)语法的对象时传递额外的参数?

时间:2014-01-07 09:24:50

标签: python function object arguments

如何在下面创建page_name对象时传递额外参数“NotebookPage”?我收到以下错误:

class NotebookPage(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)


NotebookPage(self, name='NotebookPage0', page_name=page)


TypeError: 'page_name' is an invalid keyword argument for this function

我需要在创建page_name对象时传递NotebookPage参数。但由于page_name不是wx.Panel的有效参数,我得到了这个错误。

3 个答案:

答案 0 :(得分:7)

在调用kwargs之前,您应该从__init__删除其他参数。例如,使用dict pop方法:

class NotebookPage(wx.Panel):
    def __init__(self, *args, **kwargs):
        page_name = kwargs.pop('page_name', None)
        wx.Panel.__init__(self, *args, **kwargs)
        if page_name:
            # somehow using page_name here

答案 1 :(得分:4)

在Python 3.x中,你可以简单地在其他的前面提到显式kwarg,like this

class NotebookPage(wx.Panel):
    def __init__(self, *args, page_name, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        print(page_name)

在较旧的(2.x)版本的Python中,只有在没有变量参数列表(*args)时才有效。

答案 2 :(得分:1)

您可能遇到有关继承的类初始化的问题。您正在尝试传递继承类初始化无法处理的参数。当继承的类__init__不接受*args和/或**kwargs并且您尝试传递未在继承的类__init__参数中定义的参数时,通常会发生这种情况

让我们有两个类,一个继承另一个

class A:
    def __init__(self, x, y=None):
        pass


class B(A):
    def __init__(self, *args, **kwargs):
        page_num = kwargs.get('page_num')
        A.__init__(self, *args, **kwargs)

something = B(x=1, page_num=2)

当我们创建实例something时,它会调用B.__init__。由于B接受位置和命名参数,因此这里没有问题。然后它将调用A.__init__并传递参数x=1, page_num=2A.__init__有参数x,但没有任何位置或任何命名参数来处理page_num。所以它引发了一个错误。

如果继承的类只接受预定义的参数,则必须使用{{1}从通配符参数(*args**kwargs)中删除未定义的参数}和kwargs.pop或使用args.removekwargs.get从中获取相关参数,并将其传递给继承的args[<index>]