クラス内の特定のメソッドにデコレータを実装しようとしています。これにより、値がまだ計算されていない場合、メソッドは値を計算します。それ以外の場合は、インスタンスに格納されている事前計算された値を返します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内でデコレータを宣言し、デコレータで複数の引数を渡そうとし(明らかにこれはできません)、紙飛行機をサソリの戦車に投げ込もうとしている間、回転椅子で回転してみました。どんな助けでもいただければ幸いです!