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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
postman传递当前时间戳实例详解
Sep 14 Python
python super的使用方法及实例详解
Sep 25 Python
python3中的eval和exec的区别与联系
Oct 10 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
Python 打印自己设计的字体的实例讲解
Jan 04 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实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
幼儿园校车司机的岗位职责
2014/01/30 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
颁奖典礼主持词
2014/03/25 职场文书
小学毕业演讲稿
2014/04/25 职场文书
监督检查工作方案
2014/05/28 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
员工工作能力评语
2014/12/31 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
政审证明范文
2015/06/19 职场文书
初中团委工作总结
2015/08/13 职场文书
python实现简易名片管理系统
2021/04/11 Python