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 25 Python
Django实现图片文字同时提交的方法
May 26 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
django模板语法学习之include示例详解
Dec 17 Python
python自动化报告的输出用例详解
May 30 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
python小白切忌乱用表达式
May 29 Python
python 调整图片亮度的示例
Dec 03 Python
Pandas 稀疏数据结构的实现
Jul 25 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 多行多列显示
2009/08/15 PHP
PHP开发负载均衡指南
2010/07/17 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
javascript基础知识讲解
2017/01/11 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
js实现旋转木马效果
2017/03/17 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Python collections模块实例讲解
2014/04/07 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
python实现k-means聚类算法
2018/02/23 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
python绘制玫瑰的实现代码
2020/03/02 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
房地产销售计划书
2014/01/10 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
劲霸男装广告词
2014/03/21 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书