Quizás estoy volviendo a redactar una respuesta anterior, pero esta presentación de las ideas anteriores me pareció más fácil de seguir.
Considere esta implementación de @cached_property
class cached_property(object):
"""Like @property, but caches the value."""
def __init__(self, func):
self._func = func
def __get__(self, obj, cls):
if obj is None:
return self
value = self._func(obj)
obj.__dict__[self.__name__] = value
return value
que tenía la misma pregunta con respecto a "¿Por qué se comprueban para obj
None
?"Y '¿Por qué volver auto'
Aquí hay un ejemplo de cómo las dos situaciones surgen
El uso típico:?
class Foo(object):
@cached_property
def foo(self):
# Would usually have significant computation here
return 9001
foo_instance = Foo()
foo_foo = foo_instance.foo # Behind the scenes invokes Foo.foo.__get__(foo_instance, Foo)
Espera, sí esto es lo que espero, ¿qué pasa con el caso cuando obj
es None
?
el uso no tan típico (agarrando el acceso a una versión no unida de la propiedad)
(Tomando la misma Foo
que el anterior)
>> Foo.foo
<__main__.cached_property at 0x178bed0>
En este caso la llamada se parece Foo.foo.__get__(None, Foo)
Tal vez esto se beneficiaría de la parte pertinente del ser guía en la pregunta ... para dejar en claro que esta preguntando algo diferente de "¿cómo utilizo' __get__' "... –