[英]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.