Python冷門知識之dictproxy

2021-10-04 10:40:21 字數 1747 閱讀 1380

眾所周知,python大部分物件的屬性都是由__dict__特殊屬性完成的,而且這個__dict__不僅物件可改變,而且這個屬性本身就可改變。

class_c(

object):

pass

obj = _c(

)obj.sth =

10print obj.__dict__ #

obj.__dict__[

'sth']=

100print obj.sth #100`

同樣的,在python中,類也是物件。

print _c.__dict__ #dictproxy({})
等等,dictproxy是什麼玩意?沒聽說過呀!

甭管了,反正看上去跟dict差不多,就把它當dict來處理吧!

_c.__dict__[

'x']=20

'''traceback (most recent call last):

file "d:\test.py", line 8, in _c.__dict__['x'] = 20

typeerror: 'dictproxy' object does not support item assignment

'''

什麼情況!dictproxy居然不可改變!

_c.x =

20print _c.__dict__ #dictproxy()

那這是怎麼回事,怎麼還改變了呢!

這得舉乙個生活中的例子。

假如你有乙個房間,你自己和你的家人可以隨意檢視這個房間並挪動裡面的東西,這個房間就相當於乙個dict

突然有一天,乙個消防員說這個房間有問題,電路自燃的可能性很大,並且申請時時刻刻檢查這個房間。但你總不能讓他隨便進出這個房間啊,你於是在房間的安全的地方按了乙個監控,讓他遠端看。這個監控就相當於乙個dictproxy

proxy在英文中是**的意思,直譯過來就是「dict的**」。通過這個**,你可以檢視類中的屬性,但不能修改它,要修改只能用_c.x = 20這樣的傳統修改方式。

但是,dictproxy這個類是不能直接例項化的,要例項化必須利用python api。

import ctypes

pydictproxy_new = ctypes.pythonapi.pydictproxy_new #例項化api函式

pydictproxy_new.argtypes =

(ctypes.py_object,

)#設定引數型別

pydictproxy_new.restype = ctypes.py_object #設定返回值型別

mydict =

mydictproxy = pydictproxy_new(mydict)

這樣就建立了dict物件mydict的**mydictproxy。

print mydictproxy #dictproxy({})

print

hasattr

(mydictproxy,

'__setitem__'

)#false

mydict.update(one=

1, two=

2, three=3)

print mydictproxy #dictproxy()

JS冷門知識盤點

newdate 是簡略寫法,得到毫秒 超過多行顯示省略號 overflow hidden text overflow ellipsis display webkit box webkit line clamp 2 webkit box orient vertical 建構函式才有prototype ...

Python之什麼是dict

我們已經知道,list 和 tuple 可以用來表示順序集合,例如,班裡同學的名字 adam lisa bart 或者考試的成績列表 95,85,59 但是,要根據名字找到對應的成績,用兩個 list 表示就不方便。如果把名字和分數關聯起來,組成類似的查詢表 adam 95 lisa 85 bart...

Python基礎之字典dict

字典的特性,鍵值對出現 字典的定義 字典的key不可重複,如果key重複的話,預設最後乙個元素新增到字典中,多個元素之間用逗號分割。字典是無序的 定義乙個字典 例 dic 字典的常用方法 fromkeys 引數是乙個可迭代型別,把每乙個迭代物件變成字典的key,value預設為none 可以修改 例...