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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
Python 26进制计算实现方法
May 28 Python
python实现识别相似图片小结
Feb 22 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python的标准模块包json详解
Mar 13 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
python 的numpy库中的mean()函数用法介绍
Mar 03 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
Python devel安装失败问题解决方案
Jun 09 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
python 下载文件的多种方法汇总
Nov 17 Python
python安装sklearn模块的方法详解
Nov 28 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 fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
php错误日志简单配置方法
2016/07/11 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
做网页的一些技巧
2007/02/01 Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python实现文本文件合并
2015/12/29 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
开会迟到检讨书
2014/02/03 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
安全例会汇报材料
2014/08/23 职场文书
2014年关工委工作总结
2014/11/17 职场文书
租赁协议书
2015/01/27 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS