Python新式类与super函数

2 投票
2 回答
1809 浏览
提问于 2025-04-15 22:19

这不是我期待的结果:

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 个回答

2

我完全同意Dav的观点,但你知道吗?如果B类的__init__方法只是用来调用它的父类方法,那么你可以放心地省略这个方法。我的意思是,在你的例子中,你可以简单地这样定义B类:

>>> class B(A):
...      pass
14

试试这个:

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

因为A的初始化函数需要真正的参数(而不仅仅是两个参数),所以你必须把参数和关键字参数解包后再传进去,这样它们才能被正确地重新打包。

否则,已经打包好的参数列表和关键字参数字典会被重新打包成只有两个元素的参数列表和一个空的关键字参数字典。这是因为你传入的是一个列表和一个字典,而不是实际的无名参数和有名参数。

撰写回答