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

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': {}}

我只是想让类A和类B有一致的值集。我不知道为什么要将kwargs插入args中,但我要假设我要么从子类中调用了__init__()错误,要么我试图做一些您无法做的事情。
有什么建议吗?

最佳答案

请改为:

super(B, self).__init__(*args, **kwargs)

因为A的init函数需要实际的args/kwargs(而不仅仅是两个参数),所以必须实际向它传递args/kwargs的解包版本,以便正确地重新打包它们。
否则,由于传递的是列表和dict,而不是实际的未命名和命名参数,因此已打包的args和kwargs dict列表将重新打包为包含两个元素的args列表和空kwargs dict。

10-08 07:14
查看更多