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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
浅谈五大Python Web框架
Mar 20 Python
Python操作MongoDB详解及实例
May 18 Python
Python标准库sched模块使用指南
Jul 06 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
ActiveMQ:使用Python访问ActiveMQ的方法
Jan 30 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
django 类视图的使用方法详解
Jul 24 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 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中批量替换文件名的实现代码
2011/07/20 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
php swoft框架实例用法
2020/12/22 PHP
js 调整select 位置的函数
2008/02/21 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
nodejs基础知识
2017/02/03 NodeJs
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
vue实现计步器功能
2019/11/01 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
详细介绍Python函数中的默认参数
2015/03/30 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
python实现udp聊天窗口
2020/03/31 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
班长岗位职责
2013/11/10 职场文书
迎国庆演讲稿
2014/09/05 职场文书
司机岗位职责范本
2015/04/10 职场文书
分析Python list操作为什么会错误
2021/11/17 Python
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers