这不是我期望看到的结果:
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__()
错误,要么我正在尝试做一些你不能做的事情。
任何提示?
答案 0 :(得分:14)
请改为尝试:
super(B, self).__init__(*args, **kwargs)
由于A的init函数期望实际的args / kwargs(而不仅仅是两个参数),你必须实际传递args / kwargs的解压缩版本,以便它们能够正确地重新打包。
否则,已经打包的args和kwargs的dict列表被重新打包为一个带有两个元素的args列表,以及一个空的kwargs dict,因为你传递的是一个列表和一个dict,而不是实际的未命名和命名参数。
答案 1 :(得分:2)
虽然我完全赞同戴维,但是你知道如果B的__init__
没有其他目的而不是调用它的超级,你可以安全地省略它吗?我的意思是,通过您的示例,您可以简单地将B定义为
>>> class B(A):
... pass