Как работает этот Python decorator?
Я смотрел на некоторые ленивые загрузчики декораторов свойств в Python и случайно наткнулсяhttp://code.activestate.com/recipes/363602-lazy-property-evaluation/):
class Lazy(object):
def __init__(self, calculate_function):
self._calculate = calculate_function
def __get__(self, obj, _=None):
if obj is None:
return self
value = self._calculate(obj)
setattr(obj, self._calculate.func_name, value)
return value
# Sample use:
class SomeClass(object):
@Lazy
def someprop(self):
print 'Actually calculating value'
return 13
o = SomeClass()
o.someprop
o.someprop
У меня вопрос, как это работает? Мое понимание декораторов состоит в том, что они должны вызываться (так что либо функция, либо вызов__call__
), ноLazy
тут явно нет и если я попробуюLazy(someFunc)()
это вызывает исключение, как и ожидалось. Что мне не хватает?