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 15 Python
python中pygame模块用法实例
Oct 09 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 Python
Python实现的简单dns查询功能示例
May 24 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
新手学python应该下哪个版本
Jun 11 Python
Python如何使用input函数获取输入
Aug 06 Python
python 8种必备的gui库
Aug 27 Python
python垃圾回收机制原理分析
Apr 13 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
curl和libcurl的区别简介
2015/07/01 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
详解js的六大数据类型
2016/12/27 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python3 Random模块代码详解
2017/12/04 Python
python中字符串的操作方法大全
2018/06/03 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
团员个人的自我评价
2013/12/02 职场文书
小学数学教学反思
2014/02/02 职场文书
学校搬迁方案
2014/06/15 职场文书
优秀大学生自荐信
2015/03/26 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
创业计划书之农家乐
2019/10/09 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers
Java 多线程并发FutureTask
2022/06/28 Java/Android