像属性一样访问丁字键?我发现更方便地访问切分键obj.foo而不是obj['foo'],所以我写了这个片段:class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value但是,我假设Python没有提供这种功能是有原因的。以这种方式访问dict键的警告和缺陷是什么?
5 回答

森林海
TA贡献2011条经验 获得超2个赞
class AttrDict(dict): def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(*args, **kwargs) self.__dict__ = self
真的很管用! 没有隐藏字典类方法(例如: .keys()
工作得很好) 属性和项总是同步的。 尝试以正确的方式访问不存在的键作为属性引发。 AttributeError
而不是 KeyError
方法,如 .keys()
将要 不
如果它们被传入的数据覆盖,就可以正常工作。 使. Python<2.7.4/Python 3<3.2.3 皮林特和 E1123(unexpected-keyword-arg)
和 E1103(maybe-no-member)
对于不熟悉的人来说,这似乎是一种纯粹的魔法。
这是如何工作的一个简短的解释
所有python对象内部都将它们的属性存储在名为 __dict__
.没有要求内部字典 __dict__
将需要是“简单的dict”,这样我们就可以将所有的子类分配给 dict()
内部字典。 在我们的例子中,我们只需分配 AttrDict()
实例,我们正在实例化(就像我们在 __init__
).打电话 super()
氏 __init__()
方法,确保它(已经)的行为与字典完全类似,因为该函数调用所有 字典实例化
密码。
Python不提供这种功能的一个原因是
d = AttrDict()d.update({'items':["jacket", "necktie", "trousers"]})for k, v in d.items(): # TypeError: 'list' object is not callable print "Never reached!"
添加回答
举报
0/150
提交
取消