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进阶教程之文本文件的读取和写入
Aug 29 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
python基础之包的导入和__init__.py的介绍
Jan 08 Python
Python中一些深不见底的“坑”
Jun 12 Python
python简单区块链模拟详解
Jul 03 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
django框架forms组件用法实例详解
Dec 10 Python
利用python 读写csv文件
Sep 10 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验证码类、PHP验证码
2016/09/24 PHP
javascript 短路法代码精简
2009/08/20 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
JS变量及其作用域
2017/03/29 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
python实现FTP服务器服务的方法
2017/04/11 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
制药工程专业毕业生推荐信
2013/12/24 职场文书
四年级语文教学反思
2014/02/05 职场文书
党员违纪检讨书
2014/02/18 职场文书
歌唱比赛主持词
2014/03/18 职场文书
工程承包协议书
2014/04/22 职场文书
相亲大会策划方案
2014/06/05 职场文书
语文教研活动总结
2014/07/02 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python