【发布时间】:2012-03-03 22:37:51
【问题描述】:
我正在尝试编写一个类似于某种数据存储的 Python 类。因此,例如,我不想使用字典,而是希望以 class.foo 的形式访问我的数据,并且仍然能够做所有很酷的事情,例如像 for x in dataclass 那样对其进行迭代 em>。
以下是我想出的:
class MyStore(object):
def __init__(self, data):
self._data = {}
for d in data:
# Just for the sake of example
self._data[d] = d.upper()
def __iter__(self):
return self._data.values().__iter__()
def __len__(self):
return len(self._data)
def __contains__(self, name):
return name in self._data
def __getitem__(self, name):
return self._data[name]
def __getattr__(self, name):
return self._data[name]
store = MyStore(['foo', 'bar', 'spam', 'eggs'])
print "Store items:", [item for item in store]
print "Number of items:", len(store)
print "Get item:", store['foo']
print "Get attribute:", store.foo
print "'foo' is in store:", 'foo' in store
而且,显然它有效。万岁!但是如何正确实现属性的设置呢?添加以下内容会导致__getattr__ 的递归限制:
def __setattr__(self, name, value):
self._data[name] = value
阅读文档,我应该调用超类(对象)__setattr__ 方法以避免递归,但那样我无法控制我的 self._data 字典。
有人能指出我正确的方向吗?
【问题讨论】:
-
为什么不直接将迭代内容添加到普通对象,并使用其
__dict__而不是您的字典? -
您可以使用
sys.setrecursionlimit()增加递归限制,顺便说一句。
标签: python attributes setattr