標籤:

UserDict、UserString、UserList存在的意義

最近遇到了一個繼承Python內建結構的坑兒和大家分享下。從Python 2.2開始,Python支持繼承Python內建結構,如list、dict。最近在實現一個功能,為了簡化內容,我直接繼承了dict,但是結果和預期不一樣。舉個例子:

In : class NewDict(dict):n...: def __getitem__(self, key):n...: return 42n...: nIn : d = NewDict(a=1)nIn : dnOut: {a: 42}nIn : d2 = {}nIn : d2.update(d)nIn : d2nOut: {a: 1}n

也就是說NewDict的__getitem__方法被dict.update給忽略了。這讓我很驚訝,我之前用UserDict的時候是正常的(這次為啥直接用dict也不知道抽了什麼筋):

In : from UserDict import UserDictnnIn : class NewDict(UserDict):n...: def __getitem__(self, key):n...: return 42n...: nnIn : d = NewDict(a=1)nIn : d[b] =2 nIn : dnOut: {a: 1, b: 2}nIn : d[b]nOut: 42nIn : d2 = {}nIn : d2.update(d)nIn : d2nOut: {a: 42, b: 42}n

這才是對的呀。所以我開始研究找答案。後來在PyPy的文檔中發現了原因,也就是這種C實現的結構的內建方法大部分會忽略重載的那個方法。

之前我以為UserDict這樣的類是歷史遺留問題,現在才知道是有原因的。原來UserDict、UserString、UserList這樣的模塊是非常必要的。

無恥的廣告:《Python Web開發實戰》上市了!

歡迎關注本人的微信公眾號獲取更多Python相關的內容(也可以直接搜索「Python之美」):

推薦閱讀:

文件里寫的是unicode,用python怎麼讀取成文本?
如何用Python和機器學習炒股賺錢?
Python爬蟲聯想詞視頻和代碼
[譯] Python 3.7 新特性
Python數據分析及可視化實例之可視化圖表應用簡介

TAG:Python |