Python冷門(mén)知識(shí)之dictproxy

注:本人在CSDN上也發(fā)表了這篇文章(https://blog.csdn.net/tonytong787/article/details/105116330/)载萌,此文屬原創(chuàng),而非轉(zhuǎn)載

眾所周知且警,python大部分對(duì)象的屬性都是由dict特殊屬性完成的,而且這個(gè)dict不僅對(duì)象可改變,而且這個(gè)屬性本身就可改變个扰。

class _C(object):pass
obj = _C()
obj.sth = 10
print obj.__dict__ #{'sth':10}
obj.__dict__['sth'] = 100
print obj.sth #100`

同樣的,在Python中葱色,類(lèi)也是對(duì)象递宅。

print _C.__dict__ #dictproxy({})

等等,dictproxy是什么玩意苍狰?沒(méi)聽(tīng)說(shuō)過(guò)呀办龄!
甭管了,反正看上去跟dict差不多淋昭,就把它當(dāng)dict來(lái)處理吧俐填!

_C.__dict__['x'] = 20
'''
Traceback (most recent call last):
  File "D:\test.py", line 8, in <module>
    _C.__dict__['x'] = 20
TypeError: 'dictproxy' object does not support item assignment
'''

什么情況!dictproxy居然不可改變翔忽!

_C.x = 20
print _C.__dict__ #dictproxy({'x':20})

那這是怎么回事英融,怎么還改變了呢!

這得舉一個(gè)生活中的例子歇式。
假如你有一個(gè)房間驶悟,你自己和你的家人可以隨意查看這個(gè)房間并挪動(dòng)里面的東西,這個(gè)房間就相當(dāng)于一個(gè)dict材失。
突然有一天痕鳍,一個(gè)消防員說(shuō)這個(gè)房間有問(wèn)題,電路自燃的可能性很大豺憔,并且申請(qǐng)時(shí)時(shí)刻刻檢查這個(gè)房間额获。但你總不能讓他隨便進(jìn)出這個(gè)房間啊,你于是在房間的安全的地方按了一個(gè)監(jiān)控恭应,讓他遠(yuǎn)程看抄邀。這個(gè)監(jiān)控就相當(dāng)于一個(gè)dictproxy

proxy在英文中是代理的意思昼榛,直譯過(guò)來(lái)就是“dict的代理”境肾。通過(guò)這個(gè)代理剔难,你可以查看類(lèi)中的屬性,但不能修改它奥喻,要修改只能用_C.x = 20這樣的傳統(tǒng)修改方式偶宫。

但是,dictproxy這個(gè)類(lèi)是不能直接實(shí)例化的环鲤,要實(shí)例化必須利用Python API纯趋。

import ctypes
PyDictProxy_New = ctypes.pythonapi.PyDictProxy_New #實(shí)例化API函數(shù)
PyDictProxy_New.argtypes = (ctypes.py_object,) #設(shè)置參數(shù)類(lèi)型
PyDictProxy_New.restype = ctypes.py_object #設(shè)置返回值類(lèi)型

mydict = {}
mydictproxy = PyDictProxy_New(mydict)

這樣就建立了dict對(duì)象mydict的代理mydictproxy。

print mydictproxy #dictproxy({})
print hasattr(mydictproxy, '__setitem__') #False
mydict.update(one=1, two=2, three=3)
print mydictproxy #dictproxy({'two': 2, 'three': 3, 'one': 1})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冷离,一起剝皮案震驚了整個(gè)濱河市吵冒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌西剥,老刑警劉巖痹栖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瞭空,居然都是意外死亡揪阿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)咆畏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)南捂,“玉大人,你說(shuō)我怎么就攤上這事鳖眼『谝悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵钦讳,是天一觀的道長(zhǎng)矿瘦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)愿卒,這世上最難降的妖魔是什么缚去? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮琼开,結(jié)果婚禮上易结,老公的妹妹穿的比我還像新娘。我一直安慰自己柜候,他們只是感情好搞动,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著渣刷,像睡著了一般鹦肿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辅柴,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天箩溃,我揣著相機(jī)與錄音瞭吃,去河邊找鬼。 笑死涣旨,一個(gè)胖子當(dāng)著我的面吹牛歪架,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霹陡,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼和蚪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烹棉?” 一聲冷哼從身側(cè)響起惠呼,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峦耘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旅薄,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辅髓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了少梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洛口。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凯沪,靈堂內(nèi)的尸體忽然破棺而出第焰,到底是詐尸還是另有隱情,我是刑警寧澤妨马,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布挺举,位于F島的核電站,受9級(jí)特大地震影響烘跺,放射性物質(zhì)發(fā)生泄漏湘纵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一滤淳、第九天 我趴在偏房一處隱蔽的房頂上張望梧喷。 院中可真熱鬧,春花似錦脖咐、人聲如沸铺敌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)偿凭。三九已至,卻和暖如春煤蹭,著一層夾襖步出監(jiān)牢的瞬間笔喉,已是汗流浹背取视。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留常挚,地道東北人作谭。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奄毡,于是被迫代替她去往敵國(guó)和親折欠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • https://litaotao.github.io/python-materials 1. 枚舉 - enume...
    柒呇閱讀 1,029評(píng)論 0 1
  • Python語(yǔ)言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個(gè)如下例子吼过,分析運(yùn)行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,065評(píng)論 0 15
  • Python簡(jiǎn)介 Python歷史 Python 是由 Guido van Rossum 在八十年代末和九十年代初...
    莫名其妙的一生閱讀 1,050評(píng)論 0 2
  • python學(xué)習(xí)筆記 聲明:學(xué)習(xí)筆記主要是根據(jù)廖雪峰官方網(wǎng)站python學(xué)習(xí)學(xué)習(xí)的锐秦,另外根據(jù)自己平時(shí)的積累進(jìn)行修正...
    renyangfar閱讀 3,044評(píng)論 0 10
  • Python語(yǔ)言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個(gè)如下例子,分析運(yùn)行結(jié)果: 代碼一: a = 1 def...
    時(shí)光清淺03閱讀 487評(píng)論 0 0