Kir*_*irk 5 python dictionary python-2.7
我需要创建一个扩展dict的类,然后遇到一个有趣的问题,如下图所示.
为什么d.update()忽略班级__getitem__?
编辑:这是在python2.7,它似乎不包含collections.UserDict思考UserDict.UserDict相当于我试过这个,它越来越接近,但仍然有趣的行为.
这是开放 - 封闭原则的一个例子(该类是开放的扩展,但是关闭以进行修改).这是件好事,因为它允许子类扩展或覆盖方法而不会无意中触发其他方面的行为更改而不会破坏类的不变量.
我们甚至也在纯python代码中执行此操作; 例如,在纯python有序的dict代码中,来自__init__()to 的类本地调用update()是使用名称修改完成的.这允许子类绘制器覆盖update() 而不会意外断开 __init__().
有时候,这很不方便.这意味着一个subclasser有权否决他们想改变,包括其行为的每一个方法get(),update()和其他人.但是,有一些抵消的好处(保护内部不变量,防止实现细节从抽象中泄漏,并允许用户假设这些方法彼此独立).
这种风格(由Guido从一开始就选择)是内置类型的默认值(否则我们将永远对抗segfaulting不变违规)和一些纯python类.
我们会在偏离默认值时进行记录.例如,cmd模块使用框架设计模式,让用户定义各种do_action()方法.此外,一些http模块也会这样做,特别是记录调用用户的do_GET()方法,以及如何附加自定义HTTP事件处理程序.
在没有特别记录的方法钩子(即上面列出的方法或类似的方法)中dict.__missing__(),子类应该假定方法独立性.否则,你如何知道引擎盖下的__getitem__()呼叫get(),反之亦然?
FWIW,这不是Python独有的.它在面向对象编程中出现了很多.正确设计的类要么记录影响其他方法行为的根方法,要么假定它们是独立的.
可能需要有一个常见问题解答,但这里没有任何破坏或错误(除了Python有太多的dict变体可供选择).如果某人错误地假设或认为__getitem__()必须通过其他访问器方法调用,他们会很快发现该假设是错误的(即如果他们对代码执行最小的测试).