クラス内の特定のメソッドにデコレータを実装しようとしています。値がまだ計算されていない場合、メソッドは値を計算します。そうでない場合は、これはインスタンス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