眾所周知,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 可以修改 例...