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搭建简易服务器分析与实现
Dec 15 Python
Python中的Matplotlib模块入门教程
Apr 15 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
python打开音乐文件的实例方法
Jul 21 Python
Python常用外部指令执行代码实例
Nov 05 Python
Python析构函数__del__定义原理解析
Nov 20 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隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
python爬虫常用的模块分析
2014/08/29 Python
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
Python numpy 常用函数总结
2017/12/07 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
python编写猜数字小游戏
2019/10/06 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
药品质量检测应届生求职信
2013/11/14 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
管理专员自荐信
2014/01/26 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
80后职场人的职业生涯规划
2014/03/08 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python