Tim*_*imo 0 python attributes setattr
我正在尝试编写一个类似于某种数据存储区的Python类.因此,我不想使用字典,而是希望以class.foo的形式访问我的数据,并且仍然可以执行所有很酷的操作,例如迭代它,就像数据类中的x一样.
以下是我提出的:
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
Run Code Online (Sandbox Code Playgroud)
并且,显然它有效.万岁!但是如何正确实现属性的设置呢?添加以下内容最终会在递归限制中__getattr__:
def __setattr__(self, name, value):
self._data[name] = value
Run Code Online (Sandbox Code Playgroud)
阅读文档,我应该调用超类(对象)__setattr__方法来避免递归,但这样我无法控制我的self._data dict.
有人能指出我正确的方向吗?
试试这个:
def __setattr__(self, name, value):
super(MyStore, self).__setattr__(name, value)
self._data[name] = value
Run Code Online (Sandbox Code Playgroud)
但是,你可以通过继承类似下面的东西来节省很多麻烦dict:
class MyStore(dict):
def __init__(self, data):
for d in data:
self[d] = d.upper()
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
self[name] = value
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
store.qux = 'QUX'
print "Get qux item:", store['qux']
print "Get qux attribute:", store.qux
print "'qux' is in store:", 'qux' in store
Run Code Online (Sandbox Code Playgroud)
哪个输出......
Store items: ['eggs', 'foo', 'bar', 'spam']
Number of items: 4
Get item: FOO
Get attribute: FOO
'foo' is in store: True
Get qux item: QUX
Get qux attribute: QUX
'qux' is in store: True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3664 次 |
| 最近记录: |