gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:18:35 26 4
gpt4 key购买 nike

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

subclassing_dict_problem

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

编辑:这是在 python2.7 中,它似乎不包含 collections.UserDictThinking UserDict.UserDict 与我尝试过的等效,它变得更接近,但仍然表现得有趣。

updated to use UserDict

最佳答案

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

我们甚至也在纯Python代码中做到了这一点;例如,inside the pure python ordered dict code ,从 __init__()update() 的类本地调用是使用 name mangling 完成的。 。这允许子类化器覆盖 update() without accidentally breaking __init__().

有时,这很不方便。这意味着子类化器必须重写要更改其行为的每个方法,包括 get()、update() 等。然而,也有一些抵消的好处(保护内部不变量,防止实现细节从抽象中泄漏,并允许用户假设这些方法是相互独立的)。

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

当出现偏离默认值时,我们会记录下来。例如,cmd module使用 framework design pattern ,让用户定义各种 do_action() 方法。此外,某些 http 模块也执行相同的操作,特别记录用户的 do_GET() method被调用,这就是附加自定义 HTTP 事件处理程序的方式。

在没有专门记录的方法 Hook (即上面列出的方法或 dict.__missing__() 之类的方法)的情况下,子类化器应该假定方法独立性。否则,您如何知道 __getitem__() 是否调用 get() 在幕后,反之亦然?

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

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

关于python - 字典的子类化; dict.update 返回不正确的值 - python bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38362420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com