缓存装饰器
class cached_property(object):
def __init__(self
, func
, name
=None):
self
.func
= func
self
.__doc__
= getattr(func
, '__doc__')
self
.name
= name
or func
.__name__
def __get__(self
, instance
, cls
=None):
if instance
is None:
return self
print(self
)
print(self
.func
)
print(instance
)
res
= instance
.__dict__
[self
.name
] = self
.func
(instance
)
return res
class User(object):
def __init__(self
, age
=0):
self
.age
= age
@cached_property
def getWorkYear(self
):
return 65 - self
.age
user
= User
(20)
print(user
.__dict__
)
print(user
.getWorkYear
)
print(user
.__dict__
)
print(user
.getWorkYear
)
{‘age’: 20} <main.cached_property object at 0x000002A8D3462898> <function User.getWorkYear at 0x000002A8D3459D08> <main.User object at 0x000002A8D34628D0> 45 {‘age’: 20, ‘getWorkYear’: 45} 45
cached_property主要实现的功能是,user.getWorkYear第一次会进行计算,计算完之后把实例user的__dict__[‘getWorkYear’]设置为计算后的值。下次读值的时候会直接从__dict__[‘getWorkYear’]取结果,避免了多次计算。 使用限制:只能用于只带默认参数的类