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使用gensim计算文档相似性
Apr 10 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
python 如何实现遗传算法
Sep 22 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python入门学习之类的相关知识总结
May 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 miniBB中文乱码问题解决方法
2008/11/25 PHP
帝国cms常用标签汇总
2015/07/06 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
php如何获取Http请求
2020/04/30 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python set常用操作函数集锦
2017/11/15 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
初中英语教学反思
2014/01/25 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
分公司负责人任命书
2014/06/04 职场文书
党员评议思想汇报
2014/10/08 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
初中体育课教学反思
2016/02/16 职场文书