[英]subclassing dict; dict.update returns incorrrect value - python bug?
这是开闭原则的一个例子(类对扩展是开放的,对修改是封闭的)。 这是一件好事,因为它允许子类扩展或覆盖一个方法,而不会无意中触发其他人的行为变化,也不会破坏类的不变量。
我们甚至在纯 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.