How does this Python decorator work?

I looked at some lazy decorators of loading properties in Python and happened in this example ( 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

My question is: how does it work? My understanding of decorators is that they must be callable (so either a function or a call that implements __call__), but Lazythis is clearly not there, and if I try Lazy(someFunc)(), it throws an exception as expected. What am I missing?

+3
source share
1 answer

someprop o SomeClass, SomeClass o, __get__. . . , Lazy , , , , , Lazy __get__.

    @Lazy
    def someprop(self):
       ...

, :

    def someprop(self):
       ...
    someprop = Lazy(someprop)

Lazy , : someprop () - , . Lazy - , __get__, ( , o someprop SomeClass) - , , .

+8

Source: https://habr.com/ru/post/1751419/


All Articles