Я пытаюсь написать класс 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
И, видимо, это работает. Ура! Но как правильно реализовать настройку атрибута? Добавление следующего приводит к ограничению рекурсии на __getattr__
:
def __setattr__(self, name, value):
self._data[name] = value
Читая документы, я должен вызвать метод суперкласса (объекта) __setattr__
, чтобы избежать рекурсии, но таким образом я не могу контролировать свой диктант self._data.
Может ли кто-нибудь указать мне правильное направление?