在已填充的字典上调用dict .__ init__是否安全?

时间:2013-04-02 16:20:00

标签: python

我有一个继承自内置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是否有任何目的(这是一个非常好的理由,请注意,我只是想知道这是否是唯一的原因)?

哦,我知道我可以保持原样,并做一个安心的更新,但如果你做两次相同的事情,感觉效率很低。

如果这是一个愚蠢的问题,我道歉。

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

您也可以拨打f.__init__(hi=34)

对象上的__init__方法是初始值设定项。它被调用来初始化一个新创建的对象,通常该方法假定在执行__init__时该对象仍然是新鲜空的。

如果你以后再打电话,如果它能够工作取决于课程。对于dict,它显然有效。我不相信这可以跨版本工作,您观察到的dict.__init__方法的行为未在文档中指定。恰好在CPython中,__init__被实现为self.update()(尽管在C中)。

最大的缺点是,任何试图理解您的代码的人都会感到困惑。为什么在__init__更加清晰时调用.update()