Fél*_*lix 3 python dictionary overwrite
我想创建一个dict int,你可以这样访问:
>>> my_dict["property'] = 3
>>> my_dict.property
3
Run Code Online (Sandbox Code Playgroud)
所以我做了这个:
class DictAsMember(dict):
def __getattr__(self, name):
return self[name]
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果你有嵌套dicts它不起作用,例如:
my_dict = DictAsMember()
my_dict["property"] = {'sub': 1}
Run Code Online (Sandbox Code Playgroud)
我可以访问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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1409 次 |
| 最近记录: |