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操作xml文件详细介绍
Jun 09 Python
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
python随机数分布random均匀分布实例
Nov 27 Python
在Tensorflow中查看权重的实现
Jan 24 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
pandas统计重复值次数的方法实现
Feb 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+xslt在windows平台上
2006/10/09 PHP
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
js闭包用法实例详解
2016/12/13 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
Vue 样式绑定的实现方法
2019/01/15 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
Python os模块学习笔记
2015/06/21 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
python合并多个excel文件的示例
2020/09/23 Python
关于python中remove的一些坑小结
2021/01/04 Python
Python 实现进度条的六种方式
2021/01/06 Python
Django url 路由匹配过程详解
2021/01/22 Python
高分子材料与工程专业推荐信
2013/12/01 职场文书
正规的求职信范文分享
2013/12/11 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书