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编写电话薄实现增删改查功能
May 07 Python
python实现员工管理系统
Jan 11 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
python 中xpath爬虫实例详解
Aug 26 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
Python中bisect的使用方法
Dec 31 Python
python脚本和网页有何区别
Jul 02 Python
区分python中的进程与线程
Aug 13 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 Python
python爬虫如何解决图片验证码
Feb 14 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+mysql保存和输出文件
2006/10/09 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
jquery offset函数应用实例
2012/11/14 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Python用户自定义异常的实现
2020/12/25 Python
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
投标诚信承诺书
2014/05/26 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书