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的lambda匿名函数的简单介绍
Apr 25 Python
在Django框架中编写Context处理器的方法
Jul 20 Python
Python的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
python 写入csv乱码问题解决方法
Oct 23 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
Python读取stdin方法实例
May 24 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
Python读写操作csv和excle文件代码实例
Mar 16 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在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
javascript中Object使用详解
2015/01/26 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
Vue 换肤的示例实践
2018/01/23 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
使用python加密自己的密码
2015/08/04 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
python脚本开机自启的实现方法
2019/06/28 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
HTML5通用接口详解
2016/06/12 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
文言文形式的学生求职信
2013/12/03 职场文书
安全生产投入制度
2014/01/29 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
教师求职自荐信
2015/03/26 职场文书
法律进社区活动总结
2015/05/07 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python