python – 从类外部访问self
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 从类外部访问self,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1786字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试在类中的某些方法上实现装饰器,这样如果尚未计算该值,则该方法将计算该值,否则它将仅返回预先计算的值,该值存储在实例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中声明装饰器,尝试与装饰器传递多个参数(显然你不能这样做),并在试图将纸飞机扔进我的蝎子坦克时在我的转椅上旋转.任何帮助,将不胜感激!
解决方法:
定义装饰器的方式会丢失目标对象信息.改为使用函数包装器:
def CalcOrPass(func):
@wraps(func)
def result(self, *args, **kwargs):
res = self.stats[func.__name__]
if not res:
res = func(self, *args, **kwargs)
self.stats[func.__name__] = res
return res
return result
包裹来自functools,这里不是绝对必要的,但非常方便.
附注:defaultdict采用工厂函数参数:
defaultdict(lambda: None)
但是既然你正在测试密钥的存在,你应该更喜欢一个简单的字典.
内容总结
以上是互联网集市为您收集整理的python – 从类外部访问self全部内容,希望文章能够帮你解决python – 从类外部访问self所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。