繁体   English   中英

子类化字典; dict.update 返回不正确的值 - python 错误?

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

我需要创建一个扩展 dict 的类,并遇到了一个有趣的问题,如下图中的愚蠢示例所示。

subclassing_dict_problem

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

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

更新为使用 UserDict

这是开闭原则的一个例子(类对扩展是开放的,对修改是封闭的)。 这是一件好事,因为它允许子类扩展或覆盖一个方法,而不会无意中触发其他人的行为变化,也不会破坏类的不变量。

我们甚至在纯 python 代码中也这样做; 例如, 在纯 python 有序 dict 代码中,从__init__()update()的类本地调用是使用name mangling完成的。 这允许子类覆盖update() 而不会意外破坏__init__()

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

这种样式(由 Guido 从一开始就选择)是内置类型(否则我们将永远与 segfaulting 不变违规作斗争)和一些纯 Python 类的默认样式。

当偏离默认值时,我们会记录。 例如, cmd 模块使用框架设计模式,让用户定义各种 do_action() 方法。 此外,一些 http 模块也做同样的事情,特别记录了用户的do_GET()方法被调用以及您如何附加定制的 HTTP 事件处理程序。

在没有专门记录的方法挂钩(即上面列出的方法或dict.__missing__()类的方法dict.__missing__() ,子类应假定方法独立。否则,您如何知道__getitem__()是否在__getitem__()调用了get()或副 -反之?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM