簡體   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