在Python中使用有序字典作为对象字典
我不知道为什么这不起作用:
我正在使用 PEP 372 的 ">odict 类,但我想将其用作 __dict__ 成员,即:
class Bag(object):
def __init__(self):
self.__dict__ = odict()
但由于某种原因我得到了奇怪的结果。 这有效:
>>> b = Bag()
>>> b.apple = 1
>>> b.apple
1
>>> b.banana = 2
>>> b.banana
2
但是尝试访问实际的字典不起作用:
>>> b.__dict__.items()
[]
>>> b.__dict__
odict.odict([])
而且变得更奇怪:
>>> b.__dict__['tomato'] = 3
>>> b.tomato
3
>>> b.__dict__
odict.odict([('tomato', 3)])
我感觉很愚蠢。 你能帮我吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我能找到的最接近您问题的答案是 http ://mail.python.org/pipermail/python-bugs-list/2006-April/033155.html。
基本上,如果
__dict__
不是实际的dict()
,那么它将被忽略,并且属性查找失败。另一种方法是使用 odict 作为成员,并相应地重写 getitem 和 setitem 方法。
The closest answer to your question that I can find is at http://mail.python.org/pipermail/python-bugs-list/2006-April/033155.html.
Basically, if
__dict__
is not an actualdict()
, then it is ignored, and attribute lookup fails.The alternative for this is to use the odict as a member, and override the getitem and setitem methods accordingly.
sykora的回答中的一切都是正确的。 这是一个更新的解决方案,具有以下改进:
a.__dict__
的特殊情况下也能工作,直接copy.copy()
== 和
!=
运算符collections.OrderedDict
。...
Everything in sykora's answer is correct. Here's an updated solution with the following improvements:
a.__dict__
directlycopy.copy()
==
and!=
operatorscollections.OrderedDict
from Python 2.7....
如果您正在寻找具有对 OrderedDict 属性访问权限的库,orderedattrdict 包提供了此功能。
披露:我创作了这个库。 认为这可能对未来的搜索者有所帮助。
If you're looking for a library with attribute access to OrderedDict, the orderedattrdict package provides this.
Disclosure: I authored this library. Thought it might help future searchers.