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提取页面内url列表的方法
May 25 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
python3 爬取图片的实例代码
Nov 06 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
基于python生成器封装的协程类
Mar 20 Python
详解Python基础random模块随机数的生成
Mar 23 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
Python连接Impala实现步骤解析
Aug 04 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代码
2008/04/09 PHP
PHP 日常开发小技巧
2009/09/23 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
python获取糗百图片代码实例
2013/12/18 Python
Django中几种重定向方法
2015/04/28 Python
Python实现的归并排序算法示例
2017/11/21 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
Python jieba库用法及实例解析
2019/11/04 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
Django的CVB实例详解
2020/02/10 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
天鹅的故事教学反思
2014/02/04 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
成语的广告词
2014/03/19 职场文书
群众路线领导对照材料
2014/08/23 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
2015年母亲节寄语
2015/03/23 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL