Python新风格的类和超级函数

jed*_*mao 2 python class

这不是我期望看到的结果:

class A(dict):
    def __init__(self, *args, **kwargs):
        self['args'] = args
        self['kwargs'] = kwargs

class B(A):
    def __init__(self, *args, **kwargs):
        super(B, self).__init__(args, kwargs)

print 'Instance A:', A('monkey', banana=True)
#Instance A: {'args': ('monkey',), 'kwargs': {'banana': True}}

print 'Instance B:', B('monkey', banana=True)
#Instance B: {'args': (('monkey',), {'banana': True}), 'kwargs': {}}
Run Code Online (Sandbox Code Playgroud)

我只是想让类A和B设置一致的值.我不确定为什么要将kwargs插入到args中,但我要假设我要么__init__()从子类中调用错误,要么我正在尝试做一些你不能做的事情.

有小费吗?

Amb*_*ber 14

试试这个:

super(B, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

由于A的init函数期望实际的args/kwargs(而不仅仅是两个参数),你必须实际传递args/kwargs的解压缩版本,以便它们能够正确地重新打包.

否则,已经打包的args和kwargs的dict列表被重新打包为一个带有两个元素的args列表,以及一个空的kwargs dict,因为你传递的是一个列表和一个dict,而不是实际的未命名和命名的参数.