在python中覆盖{}

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,所以你可以使用{}.

这可能吗?

jco*_*ado 7

该问题的一个解决方法是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)