像屬性一樣訪問(wèn)丁字鍵?我發(fā)現(xiàn)更方便地訪問(wèn)切分鍵obj.foo而不是obj['foo'],所以我寫了這個(gè)片段:class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value但是,我假設(shè)Python沒(méi)有提供這種功能是有原因的。以這種方式訪問(wèn)dict鍵的警告和缺陷是什么?
5 回答

森林海
TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
class AttrDict(dict): def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(*args, **kwargs) self.__dict__ = self
真的很管用! 沒(méi)有隱藏字典類方法(例如: .keys()
工作得很好) 屬性和項(xiàng)總是同步的。 嘗試以正確的方式訪問(wèn)不存在的鍵作為屬性引發(fā)。 AttributeError
而不是 KeyError
方法,如 .keys()
將要 不
如果它們被傳入的數(shù)據(jù)覆蓋,就可以正常工作。 使. Python<2.7.4/Python 3<3.2.3 皮林特和 E1123(unexpected-keyword-arg)
和 E1103(maybe-no-member)
對(duì)于不熟悉的人來(lái)說(shuō),這似乎是一種純粹的魔法。
這是如何工作的一個(gè)簡(jiǎn)短的解釋
所有python對(duì)象內(nèi)部都將它們的屬性存儲(chǔ)在名為 __dict__
.沒(méi)有要求內(nèi)部字典 __dict__
將需要是“簡(jiǎn)單的dict”,這樣我們就可以將所有的子類分配給 dict()
內(nèi)部字典。 在我們的例子中,我們只需分配 AttrDict()
實(shí)例,我們正在實(shí)例化(就像我們?cè)?/trans> __init__
).打電話 super()
氏 __init__()
方法,確保它(已經(jīng))的行為與字典完全類似,因?yàn)樵摵瘮?shù)調(diào)用所有 字典實(shí)例化
密碼。
Python不提供這種功能的一個(gè)原因是
d = AttrDict()d.update({'items':["jacket", "necktie", "trousers"]})for k, v in d.items(): # TypeError: 'list' object is not callable print "Never reached!"

嗶嗶one
TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
obj['!#$%^&*()_']
添加回答
舉報(bào)
0/150
提交
取消