2012-10-15 4 views
2

다음 코드 조각에 대해 혼동스러워합니다. 어떻게 작동합니까? 그것은 데코레이터이며 lazily 속성을 초기화하고 다음 요청에 캐시 된 속성을 사용합니다. 코드를 보면 항상 self.method를 호출하는 것 같습니다. 약간의 설명은 주변 처음 result = self.method(inst) 메소드를 호출 한 것 같습니다, 나에게다음 코드에서 속성 캐싱이 작동하는 방식은 무엇입니까?

class cached_property(object): 
    def __init__(self, method, name=None): 
     self.method = method 
     self.name = name or method.__name__ 
     self.__doc__ = method.__doc__ 
    def __get__(self, inst, cls): 
     if inst is None: 
      return self 
     result = self.method(inst) 
     setattr(inst, self.name, result) 
     return result 
+0

문맥에 대한 지식이 없으면이 코드는 무엇을 말하기가 어렵습니다 – Denis

+0

모든 마법은'setattr (inst, self.name, result) '에 의해 수행됩니다. – mgilson

답변

2

도움이 될 것입니다. 그런 다음 인스턴스의 메소드를 결과 : setattr(inst,self.name,result)으로 바꿉니다.

이어서 my_instance.my_cached_property에서 설명 자 (원래 방법과 설명자 클래스가 해당 클래스에 겹쳐 쓰여 있지 않으므로 일반 속성으로 메소드의 (초기) 결과에 실제로 액세스합니다. 속성).

+0

이것은'cached_property'가 비 데이터 설명자. 'inst .__ dict__'에 직접 결과를 설정하는'__set__' 메소드가 있다면, Python은 인스턴스 속성 대신 데이터 기술자를 사용합니다. – eryksun

+0

@eryksun - 그렇습니다. 'cached_property'는'__set__'을 가질 수 없다고 언급 했어야합니다 - 그렇지 않으면'setattr'은'cached_property .__ set __ (...)'을 호출 할 것입니다. – mgilson

+1

명확히하기 위해, 만약 setter' def __set__ (self, inst, val) : vars (inst) [self.name] = val'을 가지고 있다면,'setattr'는 이전처럼 dict 인스턴스의 속성을 설정할 것입니다. 'getattr (inst, name)'은 여전히'cached_property .__ get__'을 호출합니다. – eryksun

관련 문제