Python新风格的类和超级函数

时间:2010-05-04 06:47:08

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

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

任何提示?

2 个答案:

答案 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