Forse sto riformulando una risposta sopra, ma questa presentazione dei pensieri di cui sopra sembrava più facile da seguire per me.
Considerate questa implementazione di @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
ho avuto la stessa domanda per quanto riguarda "Perché obj
controllato per None
?"E 'Perché tornare sé'
Ecco un esempio di come entrambe le situazioni nascono
L'utilizzo tipico:?
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)
Attendere, sì questo è quello che mi aspetto, per quanto riguarda il caso quando obj
è None
?
l'utilizzo non così tipico (afferrando l'accesso a una versione non legato della proprietà)
(Prendendo lo stesso Foo
come sopra)
>> Foo.foo
<__main__.cached_property at 0x178bed0>
In questo caso la chiamata si presenta come Foo.foo.__get__(None, Foo)
fonte
2013-09-08 02:03:39
Forse questo trarrebbe vantaggio dalla parte corrispondente dell'essere guida nella domanda ... per chiarire questo chiedendo una cosa diversa da "come uso' __get__' "... –