[英]Overwrite {} in python
我想創建一個dict int,你可以這樣訪問:
>>> my_dict["property'] = 3
>>> my_dict.property
3
所以我做了這個:
class DictAsMember(dict):
def __getattr__(self, name):
return self[name]
這工作正常,但如果你有嵌套dicts它不起作用,例如:
my_dict = DictAsMember()
my_dict["property"] = {'sub': 1}
我可以訪問my_dict.property,但邏輯上我不能做my_dict.property.sub因為屬性是一個默認的dict,所以我想要做的就是覆蓋默認的dict,所以你可以使用{}。
這可能嗎?
該問題的一個解決方法是使用DictAsMember
包裝默認詞典,然后在__getattr__
方法中返回它們:
class DictAsMember(dict):
def __getattr__(self, name):
value = self[name]
if isinstance(value, dict):
value = DictAsMember(value)
elif isinstance(value, list):
value = [DictAsMember(element)
if isinstance(element, dict)
else element
for element in value]
return value
my_dict = DictAsMember()
my_dict["property"] = {'sub': 1}
print my_dict.property.sub # 1 will be printed
my_dict = DictAsMember()
my_dict["property"] = [{'name': 1}, {'name': 2}]
print my_dict.property[1].name # 2 will be printed
您可以改為使用命名元組,而不是編寫自己的類來實現my_dict.property
表示法(這稱為對象表示法)。 可以使用變量引用等對象或標准元組語法來引用命名元組。 從文檔中
[named tuple]用於創建類似元組的對象,這些對象具有可通過屬性查找訪問的字段以及可索引和可迭代的字段。
作為他們使用的一個例子:
from collections import *
my_structure = namedtuple('my_structure', ['name', 'property'])
my_property = namedtuple('my_property', ['sub'])
s = my_structure('fred', my_property(1))
s # my_structure(name='fred', property=my_property(sub=1)) will be printed
s.name # 'fred' will be printed
s.property # my_property(sub=1) will be printed
s.property.sub # 1 will be printed
有關命名元組的精彩摘要,另請參閱此問題的已接受答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.