클래스의 특정 메소드에 데코레이터를 구현하려고 시도 했으므로 값이 아직 계산되지 않은 경우 메소드가 값을 계산합니다. 그렇지 않으면 메소드가 미리 계산 된 값을 반환합니다. 이는 defaultdict
인스턴스에 저장됩니다. 클래스 외부에서 선언 된 데코레이터 내부에서 인스턴스 defaultdict
에 액세스하는 방법을 알아낼 수 없습니다. 이것을 구현하는 방법에 대한 아이디어가 있습니까? 여기 클래스 외부에서 셀프 액세스하기
from collections import defaultdict
from math import sqrt
내 장식입니다 :
class CalcOrPass:
def __init__(self, func):
self.f = func
#if the value is already in the instance dict from SimpleData,
#don't recalculate the values, instead return the value from the dict
def __call__(self, *args, **kwargs):
# can't figure out how to access/pass dict_from_SimpleData to here :(
res = dict_from_SimpleData[self.f.__name__]
if not res:
res = self.f(*args, **kwargs)
dict_from_SimpleData[self.f__name__] = res
return res
그리고 여기에 장식 된 방법과 SimpleData 클래스의 :
class SimpleData:
def __init__(self, data):
self.data = data
self.stats = defaultdict() #here's the dict I'm trying to access
@CalcOrPass
def mean(self):
return sum(self.data)/float(len(self.data))
@CalcOrPass
def se(self):
return [i - self.mean() for i in self.data]
@CalcOrPass
def variance(self):
return sum(i**2 for i in self.se())/float(len(self.data) - 1)
@CalcOrPass
def stdev(self):
return sqrt(self.variance())
여기
은 (작업 예) 수입입니다 지금까지 꾸미기를 선언하려고 시도했습니다 안에 SimpleData, 데코레이터로 여러 개의 인수를 전달하려했는데 (분명히이 작업을 수행 할 수 없음), 내 전갈 탱크에 종이 비행기를 던지면서 회전 의자에서 돌고 있습니다. 어떤 도움을 주시면 감사하겠습니다!
질문에 대한 답변이 없지만'SimpleData' 인스턴스가 아닌'defaultdict'가 데코레이터에 존재하지 않아야합니까? 나는'SimpleData'가 데코레이터의 구현 세부 사항 (당신의 문제를 해결할 것입니다)에 대해 알아야하는 이유를 알지 못합니다. – icecrime
그럴 수도 있습니다. 그러나 SimpleData의 모든 인스턴스에 대해 다른 기본 사전이 있어야합니다. –
사이드 노트 : Python 2에서 코딩 할 때 항상'object'의 클래스를 상속합니다. 그렇게하지 않으면 "이전 스타일"클래스를 제공합니다. 예상했던 것과 다른 행동을합니다. – jsbueno