Python类属性的延迟计算


Posted in Python onOctober 22, 2016

所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。

优点

构造一个延迟计算属性的主要目的是为了提升性能

实现

class LazyProperty(object):
  def __init__(self, func):
    self.func = func

  def __get__(self, instance, owner):
    if instance is None:
      return self
    else:
      value = self.func(instance)
      setattr(instance, self.func.__name__, value)
      return value


import math


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  @LazyProperty
  def area(self):
    print 'Computing area'
    return math.pi * self.radius ** 2

  @LazyProperty
  def perimeter(self):
    print 'Computing perimeter'
    return 2 * math.pi * self.radius

说明

定义了一个延迟计算的装饰器类LazyProperty。Circle是用于测试的类,Circle类有是三个属性半径(radius)、面积(area)、周长(perimeter)。面积和周长的属性被LazyProperty装饰,下面来试试LazyProperty的魔法:

>>> c = Circle(2)
>>> print c.area
Computing area
12.5663706144
>>> print c.area
12.5663706144

在area()中每计算一次就会打印一次“Computing area”,而连续调用两次c.area后“Computing area”只被打印了一次。这得益于LazyProperty,只要调用一次后,无论后续调用多少次都不会重复计算。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
重命名批处理python脚本
Apr 05 Python
python 调用c语言函数的方法
Sep 29 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
Python变量访问权限控制详解
Jun 29 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
Python如何实现定时器功能
May 28 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
python进度条显示之tqmd模块
Aug 22 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
python 调用js的四种方式
Apr 11 Python
如何在Python函数执行前后增加额外的行为
Oct 20 #Python
如何利用Fabric自动化你的任务
Oct 20 #Python
windows下ipython的安装与使用详解
Oct 20 #Python
Python做文本按行去重的实现方法
Oct 19 #Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 #Python
python类中super()和__init__()的区别
Oct 18 #Python
Python 序列的方法总结
Oct 18 #Python
You might like
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
Python中random模块用法实例分析
2015/05/19 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
python的launcher用法知识点总结
2020/08/07 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
时尚圣经:The Fashion Bible
2019/03/03 全球购物
电气自动化自荐信
2013/10/10 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
党的生日活动方案
2014/08/15 职场文书
2015年除四害工作总结
2015/07/23 职场文书
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs