Accessing OrderedDict keys like attributes in Python
我想写一个容器类
我将解决方案修改为1。将
1 2 3 4 5 6 7 8 9 10 11 12 13 | from collections import OrderedDict class mydict(OrderedDict): def __init__(self, *args, **kwargs): super(mydict, self).__init__(*args, **kwargs) self.__dict__ = self D = mydict(a=1, b=2) #D['c'] = 3 # fails D.d = 4 #print D # fails |
包含故障注释的两行会导致以下错误:
1 2 3 4 5 6 7 8 | print D File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 176, in __repr__ return '%s(%r)' % (self.__class__.__name__, self.items()) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 113, in items return [(key, self[key]) for key in self] File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 76, in __iter__ root = self.__root AttributeError: 'struct' object has no attribute '_OrderedDict__root' |
和
1 2 3 4 | D['c'] = 3 File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 58, in __setitem__ root = self.__root AttributeError: 'mydict' object has no attribute '_OrderedDict__root' |
有解决办法吗?
首先,如果你只是想让它正常工作,不知道你的尝试有什么问题,在Pypi、ActiveState等上有多个"attrdict"实现。搜索一个并查看它的代码,或者安装并使用它。
你想要的不是
特别是,它意味着您现在已经失去了所有现有的属性,包括
当您使用
python有定制属性访问的特殊方法。您要做的是实现这些方法:
1 2 3 4 5 6 7 | class AttrDict(OrderedDict): def __getattr__(self, name): return self[name] def __setattr__(self, name, value): self[name] = value def __delattr__(self, name): del self[name] |
但是,在这种情况下,即使这样也不能解决所有问题,因为当
"有些"很复杂,很难纠正。一个更简单的解决方案是封装并委托给
1 2 3 4 5 6 7 8 9 10 11 12 | class AttrDict(object): def __init__(self, *args, **kwargs): self._od = OrderedDict(*args, **kwargs) def __getattr__(self, name): return self._od[name] def __setattr__(self, name, value): if name == '_od': self.__dict__['_od'] = value else: self._od[name] = value def __delattr__(self, name): del self._od[name] |
或者,更简单地说,只需使用一个有序的dict作为你的
后一种解决方案只是让您成为一个具有恰好是有序的属性的普通对象,而不是一个映射。但转发映射方法也很容易。执行
现在,如果您返回查看pypi上的"attrdict"并单击实现,您将看到它们都是这样做的:它们将