0

我有一个继承自内置类的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除了代码的清晰度和可读性之外,调用常规字典是否有任何目的(请注意,这是一个很好的理由,我只是想知道这是否是唯一的原因)?

哦,我知道我可以保持原样并进行更新以使您安心,但是如果您两次执行相同的操作,则会感觉效率很低。

如果这是一个愚蠢的问题,我深表歉意。

谢谢你的时间。

4

1 回答 1

3

您也可以调用f.__init__(hi=34).

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

如果您稍后再次调用它,它是否会起作用取决于课程。因为dict它显然有效。我不会指望这种跨版本的工作,dict.__init__文档中未指定您观察到的方法的行为。碰巧在 CPython 中,__init__被实现为self.update()(尽管在 C 中)。

最大的缺点是它会使任何试图理解您的代码的人感到困惑。为什么打电话__init__什么时候.update()清楚得多?

于 2013-04-02T16:22:25.397 回答