我有一个继承自内置dict
类的类。过去看起来有点像:
class AwesomeDictionary(dict):
def __init__(self, *args, **args):
self['hello'] = 'world'
i = {}
dict.__init__(i, *args, **kargs)
self.update(i)
我用临时字典实现了它,因为我认为__init__
会创建一个全新的字典或至少清除它。
我最近才意识到你可以在Python解释器中做这样的事情而没有任何问题:
f = {'hi':56, '67':89}
dict.__init__(f, **{'h':67})
print f
#You get: {'67': 89, 'h': 67, 'hi': 56}
如果您指定相同的字段:
f = {'hi':56, '67':89}
dict.__init__(f, **{'hi':34})
print f
#You get: {'67': 89, 'hi': 34}
因此,在这种情况下,似乎__init__
的行为与.update
相同。
为什么会出现这种情况有特殊原因,我是否可以期望这在实现和版本中保持一致?
在类似的说明中,除了代码清晰度和可读性之外,在常规词典上调用.update
是否有任何目的(这是一个非常好的理由,请注意,我只是想知道这是否是唯一的原因)?
哦,我知道我可以保持原样,并做一个安心的更新,但如果你做两次相同的事情,感觉效率很低。
如果这是一个愚蠢的问题,我道歉。
感谢您的时间。
答案 0 :(得分:3)
您也可以拨打f.__init__(hi=34)
。
对象上的__init__
方法是初始值设定项。它被调用来初始化一个新创建的对象,通常该方法假定在执行__init__
时该对象仍然是新鲜空的。
如果你以后再打电话,如果它能够工作取决于课程。对于dict
,它显然有效。我不相信这可以跨版本工作,您观察到的dict.__init__
方法的行为未在文档中指定。恰好在CPython中,__init__
被实现为self.update()
(尽管在C中)。
最大的缺点是,任何试图理解您的代码的人都会感到困惑。为什么在__init__
更加清晰时调用.update()
?