我試圖在類中的某些方法上實現裝飾器,以便如果該值尚未計算出來,則該方法將計算該值,否則它將僅返回預先計算的值,其存儲在實例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,試圖向裝飾者傳遞多個參數(顯然你不能這樣做),並在我的轉椅上旋轉,試圖將紙飛機扔進我的蠍子坦克。任何幫助,將不勝感激!
我對你的問題沒有很好的回答,但是'defaultdict'不應該存在於裝飾器而不是'SimpleData'實例中?我不明白爲什麼'SimpleData'應該知道什麼似乎是裝飾器的實現細節(這也可以解決您的問題)。 – icecrime 2012-04-15 20:35:03
嗯,可能會工作。我需要爲SimpleData的每個實例都有一個不同的默認字典,但是... – 2012-04-15 20:38:24
附註:在Python 2中進行編碼時,總是從'object'繼承你的類。不這樣做會給你「舊式」類有不同於預期的行爲。 – jsbueno 2012-04-15 21:03:24