Vielleicht formuliere ich eine obige Antwort, aber diese Darstellung der obigen Gedanken schien mir leichter zu folgen.
Betrachten Sie diese Implementierung von @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
ich die gleiche Frage hatte zum Thema „Warum obj
für None
geprüft?"Und‚Warum selbst zurückkehren‘
Hier ist ein Beispiel dafür, wie beide der Situationen entstehen
Die typische Nutzung:?
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)
Warten, ja das ist, was ich erwarte, was über den Fall wenn obj
None
ist?
die nicht so typische Verwendung (Zugang zu einer ungebundenen Version des Objektes Rupfen)
(Unter Verwendung des gleichen Foo
wie oben)
>> Foo.foo
<__main__.cached_property at 0x178bed0>
In diesem Fall wird der Anruf wie Foo.foo.__get__(None, Foo)
von
Vielleicht ist dies von dem betreffenden Teil des Führungs Wesen profitieren würden in der Frage ... um klar zu stellen, dass eine andere Sache von "wie verwende ich' __get__' "... –