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

2024-10-01 05:02:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 对象nameself参数initdef错误page
3条回答

在python3.x中,您只需在其他表达式之前提到显式kwarg,like this

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

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

您可能对继承的类初始化有问题。您试图传递继承的类初始化无法处理的参数。当继承的类__init__不接受*args,和/或{},并且您试图传递一个未在继承类__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。所以这就产生了一个错误。在

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

在调用__init__之前,应该删除kwargs中的其他参数。例如dict^{}方法:

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

相关问题 更多 >