今天在同事的推荐下,看了下扇贝的sea代码,
没细看,突然看到了cached_property
的代码,这个让我突然想到了我们内部爬虫框架的cached_property
,当时我在写这部分代码的时候主要目的有点类似如下:
1 | class A(object): |
A
为一个类,然后B
有点类似A
的一个超集,平常使用的使用为实例化B
, 然后为了操作A
下面的方法,基本流程为:
1 | b = B() |
当时设计的时候,并没有想到通过property这个将方法变成属性的方法,当时想我只需要初始化两次就行,如下:
1 |
|
但是后来我就意识到我这种设计有点low,因为其他同事调用的时候可能不会这么使用,另外因为B
下面还会有其他类似A
这种东西,例如:
1 | class B(object): |
难道每次使用的时候都拿到c这个实例吗,有点傻,所以参考了Flask
的cached_property
实现,改成了如上了流程.那么进入主题,cached_property
到底干了什么事情?
先看Flask
的实现:
1 |
|
再看sea
的实现:
1 |
|
唯一不同点应该就在于加了一个锁吧,那么抛去锁的部分,单纯讲cached_propery
的实现
1 |
|
第一步
学过Python的应该蛮清楚关于装饰器这个概念,当将cached_property加在b上时,就已经完成了cached_property类的实例化(看最后一个类版本的计算时间装饰器),那怎么传进去的呢?
1 |
|
第二步
调用的时候怎么个过程?看Python Document
1 | class Property(object): |
1 | def __get__(self, instance, cls=None): |
总结
1 | class B(object): |
剩下自行理解吧..
1 | # 类版本的计算时间的装饰器 |