Я хочу создать декоратор, который работает как свойство, только он называет украшенную функцию только один раз, а на последующих вызовах всегда возвращает результат первого вызова. Пример:Как создать декоратор для ленивой инициализации свойства
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 Извините за это, я забыл упомянуть, что хочу, чтобы свойство было только для чтения.
Это может быть дубликатом моего вопроса: [Python ленивого свойства декоратор] (http://stackoverflow.com/questions/3012421/python-lazy-property-decorator) – detly
Вы правы это. Не видел его в окне предложений. Голосование закрывается. –