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

4
当我创建下面的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不是wx.Panel的有效参数,所以出现了错误。


为了与Python的命名一致,您应该使用kwarg代替kwargs - zmo
3个回答

7
调用 __init__ 之前,您应该从 kwargs 中删除多余的参数。例如使用字典 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

谢谢,这是在这种情况下通常使用的方法吗? - alwbtc
@alwbtc 是的,我想是这样。 - ndpu

4
在Python 3.x中,您可以在其他kwargs之前简单地提到显式的kwarg,像这样
class NotebookPage(wx.Panel):
    def __init__(self, *args, page_name, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        print(page_name)

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

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,因此它会引发错误。
如果继承类只接受预定义参数,则必须使用kwargs.popargs.remove从通配符参数(*args**kwargs)中删除未定义的参数,或使用kwargs.getargs[<index>]从中获取相关参数,并将它们传递给继承的__init__函数。

非常感谢您提供的详细解释。 - alwbtc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接