如何在下面创建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
的有效参数,我得到了这个错误。
答案 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=2
。 A.__init__
有参数x
,但没有任何位置或任何命名参数来处理page_num
。所以它引发了一个错误。
如果继承的类只接受预定义的参数,则必须使用{{1}从通配符参数(*args
和**kwargs
)中删除未定义的参数}和kwargs.pop
或使用args.remove
或kwargs.get
从中获取相关参数,并将其传递给继承的args[<index>]