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 修改文件指定行的方法
May 15 Python
Python3基础之条件与循环控制实例解析
Aug 13 Python
go语言计算两个时间的时间差方法
Mar 13 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
python实现媒体播放器功能
Feb 11 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
基于python实现操作git过程代码解析
Jul 27 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
实例代码讲解Python 线程池
Aug 24 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
PHP foreach循环使用详解与实例代码
2010/05/08 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
Python生成随机验证码的两种方法
2015/12/22 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
解决uWSGI的编码问题详解
2017/03/24 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
如何使用Python 打印各种三角形
2019/06/28 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
如何选择使用结构还是类
2014/05/30 面试题
大学生求职中的自我评价
2013/10/01 职场文书
个人自我剖析材料
2014/02/07 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
全新239军机修复记
2022/04/05 无线电
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL