cached_property修饰过的函数,变成是对象的属性,该对象第一次引用该属性时,会调用函数,对象第二次引用该属性时就直接从词典中取了,这也说明引用属性是经过__getattritue__。

class cached_property(object):
"""
Decorator that converts a method with a single self argument into a
property cached on the instance. Optional ``name`` argument allows you to make cached properties of other
methods. (e.g. url = cached_property(get_absolute_url, name='url') )
"""
def __init__(self, func, name=None):
self.func = func
self.__doc__ = getattr(func, '__doc__')
self.name = name or func.__name__ def __get__(self, instance, type=None):
if instance is None:
return self
res = instance.__dict__[self.name] = self.func(instance)
return res
class Monopoly(object): def __init__(self):
self.boardwalk_price = 500 @cached_property
def boardwalk(self):
# Again, this is a silly example. Don't worry about it, this is
# just an example for clarity.
self.boardwalk_price += 50
return self.boardwalk_price monopoly = Monopoly()
print monopoly.boardwalk
print monopoly.boardwalk
print monopoly.boardwalk
del monopoly.__dict__['boardwalk']
print monopoly.boardwalk
print monopoly.boardwalk

输出为:

*** Remote Interpreter Reinitialized  ***
>>>
550
550
550
600
600
>>>

cached_property的使用的更多相关文章

  1. 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。

    使用 from lazy_object_proxy.utils import cached_property,使用这个装饰器. 由于官方的行数比较少,所以可以直接复制出来用自己的. class cac ...

  2. [python]@cached_property缓存装饰器

    cached_property缓存装饰器 class cached_property(object): """ Decorator that converts a met ...

  3. Python之路,Day8 - Python基础 面向对象高级进阶与socket基础

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  4. Python-面向对象(类)二

    一.成员修饰符 • 共有成员 • 私有成员 __+字段 __:成员修饰符 无法直接访问,只能通过该成员所属类的方法简介访问 class Foo: def __init__(self, name, ag ...

  5. Python 面向对象 中高级

    类成员: #字段 普通字段 属于对象 执行只能通过对象访问 静态字段 属于类 执行 既可以通过对象访问,也可以通过类访问 class Foo: def __init__(self,name): # 字 ...

  6. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  7. Python自动化之django的ORM操作——Python源码

    """ The main QuerySet implementation. This provides the public API for the ORM. " ...

  8. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  9. Python基础篇【第7篇】: 面向对象(2)

    上一篇<初识面向对象>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公 ...

随机推荐

  1. C语言入门(1)

    开始学习C语言 第一个C语言程序 #include<stdio.h> int main() { printf("Hello World!"); } C程序结构 1. 头 ...

  2. 理解java容器:iterator与collection,容器的起源

    关于容器 iterator与collection:容器的起源 iterator的简要介绍 iterable<T> iterator<T> 关于remove方法 Collecti ...

  3. 修改应用进程open file值

    本文用于记录java应用日志too many open files报错解决方法 操作系统:RHEL5.8 一.修改配置文件 1.vim /etc/security/limits.conf 加上:* s ...

  4. vs2015 无法连接到已配置的开发web服务器

    问题一:vs2015 无法连接到已配置的开发web服务器 最靠谱方法如下:(和防火墙开启无关联, 注册表增加什么键值无关联 , 缺失asp.net core.Dll文件无关联 ) 分析,因为前提是你的 ...

  5. Winfrom BackgroundWorker

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection ...

  6. WIN7以上系统安装VB6的解决办法,附上个批处理。

    一.安装时显示oledb32r.dll不能在系统注册数据库中注册在C盘查找oledb32r.dll,改名为oledb32r-2.dll即可,dll冲突了. 二.WIN7安装VB6提示VB98ENT.S ...

  7. python列表中的所有值转换为字符串,以及列表拼接成一个字符串

    >>> ls1 = ['a', 1, 'b', 2] >>> ls2 = [str(i) for i in ls1] >>> ls2 ['a', ...

  8. Ubuntu 15.10 下Tachyon安装

    1 系统环境 Ubuntu 15.10, Java 1.7, Hadoop 2.6.0 HA, Spark-1.4.0 三台机器 spark-1423-0001: Master, Worker spa ...

  9. Linux下阅读源代码工具安装

    综合他们多篇博客,做一个自己的总结(从0开始,记录过程) 系统:ubuntu 16.04  vim:7.4.1689 内容来源: https://www.cnblogs.com/wangzhe1635 ...

  10. Cleanmymac X好不好用?

    Cleanmymac X是一款Mac清理软件,能够帮助我们快速实现快速实现磁盘清理,是mac用户的智能助手.那么为什么大家会认定它并坚定不移呢?小编带你感受感受. 1. 简洁大气的外观. 用户正版官方 ...