Я хочу создать декоратор, который работает как свойство, только вызывает декоративную функцию только один раз, а при последующих вызовах всегда возвращает результат первого вызова. Пример:
def SomeClass(object):
@LazilyInitializedProperty
def foo(self):
print "Now initializing"
return 5
>>> x = SomeClass()
>>> x.foo
Now initializing
5
>>> x.foo
5
Моя идея состояла в том, чтобы написать собственный декоратор для этого. Итак, я начал, и вот как далеко я продвинулся:
class LazilyInitializedProperty(object):
def __init__(self, function):
self._function = function
def __set__(self, obj, value):
raise AttributeError("This property is read-only")
def __get__(self, obj, type):
# problem: where to store the value once we have calculated it?
Как видите, я не знаю, где хранить кешированное значение. Кажется, что самое простое решение - просто поддерживать словарь, но мне интересно, есть ли для этого более элегантное решение.
EDIT Извините за это, я забыл упомянуть, что я хочу, чтобы свойство было доступно только для чтения.