子类字典; dict.update returns 错误值 - python 错误?

subclassing dict; dict.update returns incorrrect value - python bug?

我需要做一个 class 来扩展 dict 和 运行 成为一个有趣的问题,如下图中的愚蠢示例所示。

为什么 d.update() 忽略 class 的 __getitem__

编辑:这是在 python2.7 中,似乎不包含 collections.UserDict 认为 UserDict.UserDict 是我试过的等价物,它越来越接近,但仍然表现得很有趣。

这是 open-closed-principle 的示例(class 对扩展开放但对修改关闭)。这是一件好事,因为它允许 subclassers 扩展或重写一个方法,而不会无意中触发其他人的行为变化,也不会破坏 classes 的不变量。

我们甚至在纯 python 代码中也这样做;例如,inside the pure python ordered dict code, the class local call from __init__() to update() is done using name mangling. This allows a subclasser to override update() without accidentally breaking __init__().

有时候,这很不方便。这意味着 subclasser 必须覆盖他们想要更改其行为的每个方法,包括 get()update() 和其他方法。然而,也有抵消的好处(保护内部不变量,防止实现细节从抽象中泄漏,并允许用户假设方法相互独立)。

这种风格(由 Guido 从一开始就选择)是内置类型(否则我们将永远与段错误不变量冲突作斗争)和一些纯粹的 python classes.

当有偏离默认值时,我们会记录。例如,调用 cmd module uses the framework design pattern, letting the user define various do_action() methods. Also, some of the http modules do the same, specifically documenting that a user's do_GET() method,这就是您附加自定义 HTTP 事件处理程序的方式。

在没有专门记录的方法挂钩(即上面列出的方法或类似 dict.__missing__() 的方法的情况下,subclasser 应该假设方法独立。否则,你怎么知道 __getitem__() 在幕后调用 get() 或者反之亦然?

FWIW,这不是 Python 独有的。它在面向对象编程中出现了很多。正确设计 classes 要么记录影响其他方法行为的根方法,要么假定它们是独立的。

可能需要一个常见问题解答,但这里没有任何问题或错误(除了 Python 有太多的字典变体可供选择)。如果有人错误地假设或认为 __getitem__() 必须由其他访问器方法调用,他们很快就会发现该假设是错误的(也就是说,如果他们 运行 即使对代码进行了最小的测试)。