飘逸的python - property及实现lazy property
来源:互联网 发布:梦幻西游手游代练软件 编辑:程序博客网 时间:2024/05/21 09:04
@property有什么用呢?表面看来,就是将一个方法用属性的方式来访问.
上代码,代码最清晰了.
class Circle(object): def __init__(self, radius): self.radius = radius @property def area(self): return 3.14 * self.radius ** 2c = Circle(4)print c.radiusprint c.area
可以看到,area虽然是定义成一个方法的形式,但是加上@property后,可以直接c.area,当成属性访问.
现在问题来了,(不是挖掘机技术哪家强),每次调用c.area,都会计算一次,太浪费cpu了,怎样才能只计算一次呢?这就是lazy property.
class lazy(object): def __init__(self, func): self.func = func def __get__(self, instance, cls): val = self.func(instance) setattr(instance, self.func.__name__, val) return valclass Circle(object): def __init__(self, radius): self.radius = radius @lazy def area(self): print 'evalute' return 3.14 * self.radius ** 2c = Circle(4)print c.radiusprint c.areaprint c.areaprint c.area可以看到,'evalute'只输出了一次.如果看了我前面几篇博文,对@lazy的机制应该很好理解.
在这里,lazy类有__get__方法,说明是个描述器,第一次执行c.area的时候,因为顺序问题,先去c.__dict__中找,没找到,就去类空间找,在类Circle中,有area()方法,于是就被__get__拦截.
在__get__中,调用实例的area()方法算出结果,并动态给实例添加个同名属性把结果赋给它,即加到c.__dict__中去.
再次执行c.area的时候,先去c.__dict__找,因为此时已经有了,就不会经过area()方法和__get__了.
10 0
- 飘逸的python - property及实现lazy property
- python 描述器,及property 的实现
- Python延迟初始化(lazy property)
- python 的property函数
- python 的 @property
- Python @property 的说明
- python的@property
- python property的用法
- 【python】@property 的使用
- python property的使用
- Python @property 的用法
- python -- property()/@property
- python @property
- Python @property
- Python @property
- Python @property
- python @property
- python Property
- 直接选择排序 (异或swap两个数存在陷阱)
- ReadConsoleInputA no longer works correctly with DBCS in Windows 8.1
- 阻桌仔浊综总捉妆状揍转庄滓撞孜钻拙尊
- 归并排序
- 安卓开发遇到的一些非代码问题
- 飘逸的python - property及实现lazy property
- Oracle性能分析11:系统统计信息
- 用storyboard创建collectionviewcell和tableviewcell时遇到的蛋疼问题
- java中发送post请求
- 关于测试人员的职业发展
- 淄祝佐总琢坐租走状组赘装最佐座住渍缀
- ORA-4031
- 最搞笑的iOS应用---疯狂笑料
- Linux内核编译后地址空间的整理