利用类装饰器自定制property实现延迟计算
class LazyProperty:
'''
hello,我是非数据描述符(没有定义__set__,不然是大哥数据描述符了--!)
'''
def __init__(self, func):
print('>>>>>>>>>>这是LazyProperty的初始化方法__init__')
# print(func)
# print(func.__name__)
self.func = func
def __get__(self, instance, owner):
print('》》》》》》这是__get__方法')
# 类调用时instance为None,这时返回CrazyProperty对象
if instance is None:
return self
res = self.func(instance)
# 把结果保存到实例属性字典,可以实现延迟计算。即函数不用来回多次调用,提高效率
setattr(instance, self.func.__name__, res)
return res
class Room:
def __init__(self, name, width, height):
self.name = name
self.width = width
self.height = height
# 类也可以作为装饰器,而且还是一个描述符呢,有意思吧
@LazyProperty # area = LazyProperty(area) 函数属性area被CrazyProperty代理了
def area(self):
return self.width * self.height
r1 = Room('toilet', 1, 1)
print(r1.area)
print(r1.area)
print(r1.area)
print(r1.area)
运行结果
>>>>>>>>>>这是LazyProperty的初始化方法__init__
》》》》》》这是__get__方法
1
1
1
1
由结果可以看出,__get__只运行了一次,结果保存到了实例的属性字典,后面的调用直接在实例属性字典里取值。
利用类装饰器自定制property实现延迟计算的更多相关文章
- python 描述符 上下文管理协议 类装饰器 property metaclass
1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分py ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python高级 之(二) --- 类装饰器
装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...
- python装饰器2:类装饰器
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...
- 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块
'''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...
- 内置装饰器二:@property
property 装饰器的作用 property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取.相当于实现get方法的对象 class People: def __init__(self ...
- 详解Python闭包,装饰器及类装饰器
在项目开发中,总会遇到在原代码的基础上添加额外的功能模块,原有的代码也许是很久以前所写,为了添加新功能的代码块,您一般还得重新熟悉源代码,稍微搞清楚一点它的逻辑,这无疑是一件特别头疼的事情.今天我们介 ...
- [b0019] python 归纳 (五)_类装饰器
总结: 类装饰器, 本质是一个函数,输入一个类,返回一个类 Case 1 啥都没做 def deco(in_class): return in_class @deco class Cat: def _ ...
- python带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的类装饰器(和不带参数的类装饰器有很大的不同) # 类装饰器的实现,必须实现__call__和__init_ ...
随机推荐
- (6)css盒子模型(基础下)
一.理解多个盒子模型之间的相互关系 现在大部分的网页都是很复杂的,原因是一个“给人用的”网页中是可能存在着大量的盒子,并且它们以各种关系相互影响着. html与DOM的关系 详情了解“DOM” :ht ...
- js下传递的时间用strtotime()函数解析差8小时
php 日期转时间戳: $time = $_POST["time"];$time = strtotime($time)-8*3600; php 时间戳转日期: date_defa ...
- Go语言多态
总结一下Go语言中多态 package main import "fmt" //申明一个函数类型 type FuncMs func(int ,int) int //加法 func ...
- 安装 Spring 框架库
下载地址:http://repo.spring.io/release/org/springframework/spring
- macbook pro上安装vmware虚拟机
http://xclient.info/s/vmware-fusion.html?_=84739015bcde24a4cc7a744d2d5f748b https://docs.vmware.com/ ...
- Join方法,yield方法,线程的优先级
- Cenos7 切换单用户模式
CentOS 7在进入单用户的时候和6.x做了很多改变,下面让我们来看看如何进入单用户. 1.重启服务器,在选择内核界面使用上下箭头移动 2.选择内核并按“e” 3.修改参数 将rhgb quiet ...
- AJPFX总结IO流中的缓冲思想
缓冲思想 (因为内存的运算速度要远大于硬盘的原酸速度,所以只要降低硬盘的读写次数,就可以提高效率) 1. 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多, 2. 这是加 ...
- Java BigDecimal类的使用和注意事项
1.对于金额相关运算,若是精度较高,基本上用BigDecimal进行运算,精度要求低的话用Long.Double即可 2.web后台接受金额用String接受,展示到前端一般也转成 String 3. ...
- jq星星评分
html代码 <div class="make_mark"> <h5>请为这次服务打分</h5> <div class="mar ...