おそらく私は上記の答えを言い換えていますが、上記の考えのこのプレゼンテーションは、私にとってより簡単に理解できるように思えました.
@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
「なぜobj
チェックされるのNone
ですか?」に関して同じ質問がありました。と「なぜ自己を返すのですか?」
両方の状況がどのように発生するかの例を次に示します
典型的な使用法:
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)
待って、ええ、これは私が期待していることobj
ですNone
。
あまり一般的ではない使用法 (プロパティのバインドされていないバージョンへのアクセスを取得する)
(Foo
上記と同じ)
>> Foo.foo
<__main__.cached_property at 0x178bed0>
この場合、呼び出しは次のようになりますFoo.foo.__get__(None, Foo)