像属性一样访问丁字键?我发现更方便地访问切分键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
提交
取消
