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 可爱的大小写
Sep 06 Python
python 正则表达式 概述及常用字符
May 04 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
解决Python2.7读写文件中的中文乱码问题
Apr 12 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 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 set_time_limit()函数的使用详解
2013/06/05 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
js 调用百度分享功能
2017/02/27 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
python对数组进行反转的方法
2015/05/20 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
护理专业大学生自我推荐信
2014/01/25 职场文书
社会学专业求职信
2014/02/24 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
职代会闭幕词
2015/01/28 职场文书
培训通知书模板
2015/04/17 职场文书
圣诞晚会主持词
2015/07/01 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Nginx速查手册及常见问题
2022/04/07 Servers
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server