緩存裝飾器
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) # function User.getWorkYear
print(instance) # <__main__.User object
# self.func(instance) 相當於 getWorkYear(user)
# 調用示例方法 getWorkYear 把 自己傳進去
# getWorkYear(self) = getWorkYear(instance) = self.func(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) # 45
# print(user.getWorkYear()) # error
print(user.__dict__) # {'age': 20, 'getWorkYear': 45}
print(user.getWorkYear) # 45
{‘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’]取結果,避免了多次計算。
使用限制:只能用於只帶默認參數的類