Когда атрибут с именем someprop
доступен в экземпляре o
класса SomeClass
, если SomeClass
содержит дескриптор с именем o
, то метод __get__
класса этого дескриптора используемый. Подробнее о дескрипторах см. в этом руководстве . Не позволяйте тому факту, что Lazy
здесь используется синтаксически в качестве декоратора, вы не ослепляете вас тем фактом, что его экземпляры являются дескрипторами, потому что сам Lazy
имеет метод __get__
.
Синтаксис декоратора
@Lazy
def someprop(self):
...
не больше и не меньше, чем синтаксический сахар для:
def someprop(self):
...
someprop = Lazy(someprop)
Ограничения на Lazy
ничем не отличаются, когда он используется с синтаксисом декоратора или напрямую: он должен принимать someprop
(функцию) в качестве аргумента - никаких ограничений на то, что он возвращает. Здесь Lazy
является классом, поэтому он возвращает сам экземпляр и имеет специальный метод __get__
, чтобы экземпляр был дескриптором (поэтому указанный метод вызывается при обращении к атрибуту someprop
в экземпляре o
класса SomeClass
) - это все, что нужно, не больше и не меньше.