cached_property緩存裝飾器

緩存裝飾器

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’]取結果,避免了多次計算。
使用限制:只能用於只帶默認參數的類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章