python惰性计算(Lazily evaluated)

python惰性计算(Lazily evaluated)

这是一种常用的设计模式,利用装饰器将Python类中的方法转变为属性,通常用于计算量大,频繁调用,且不带参数的方法,这样在实例化的时候只计算一次,并保存到类属性中,以后直接拿来用就行

实现代码:

import functoolsclass Lazy:def __init__(self, function):self.function = functionfunctools.update_wrapper(self, function)def __get__(self, obj, type_):if obj is None:return selfval = self.function(obj)obj.__dict__[self.function.__name__] = valreturn valdef lazy(fn):attr = "_lazy__" + fn.__name__@propertydef _lazy_property(self):if not hasattr(self, attr):setattr(self, attr, fn(self))return getattr(self, attr)return _lazy_property

测试一下:

class Count:def __init__(self):self.count1 = 0self.count2 = 0@Lazydef fa(self):# 每调用一次就加一self.count1 += 1return 99@lazydef fb(self):# 每调用一次就加一self.count2 += 1return 999if __name__ == '__main__':c = Count()print(c.count1, c.count2)c.fac.fbprint(c.count1, c.count2)c.fac.fac.fac.fbc.fbc.fbprint(c.count1, c.count2)

输出:

0 0
1 1
1 1

注意:调用的时候不可以带括号,因为它已经不是函数了

参考:
Lazily-evaluated


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部