[关闭]
@songying 2018-07-27T21:59:16.000000Z 字数 1080 阅读 1071

常见的装饰器

python高级特性


https://blog.csdn.net/youngbit007/article/details/68957848
https://www.zhihu.com/question/20021164

@staticmethod

staticmethod 表示静态方法, 可以通过对象和类对象实例访问。

@classmethod

@property

当我们给方法加上@property时,我们就可以把该方法当成一个属性来用, 此时会创建一个新的装饰器@funcname.setter,它可以把被装饰的方法变成属性来赋值。如果没有实现@funcname.setter时, 这个方法就只是一个只读属性,如果修改它,会引发AttributeError

  1. class Exam(object):
  2. def __init__(self, score):
  3. self._score = score
  4. @property
  5. def score(self):
  6. return self._score
  7. @score.setter
  8. def score(self, val):
  9. if val < 0:
  10. self._score = 0
  11. elif val > 100:
  12. self._score = 100
  13. else:
  14. self._score = val

functools.wraps: 保留函数元信息

functools.lru_cache: 备忘功能

这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算。

  1. @functools.lru_cache()

注意: lru_cache可以使用两个可选的参数来配置。

  1. functools.lru_cache(maxsize=128, typed=False)
  • maxsize: 指定存储多少个调用的结果。缓存满了之后,旧的结果会被扔掉,腾出空
    间。为了得到最佳性能,maxsize 应该设为 2 的幂。
  • typed 参数如果设为 True,把不同参数类型得到的结果分开保存,即把通常认为相等的浮点数和整数参数(如 1 和 1.0)区分开。
  • 因为 lru_cache使用字典存储结果,而且键根据调用时传入的定位参数和关键字参数创建,所以被 lru_cache 装饰的函数,它的所有参数都必须是可散列的。

functools.singledispatch: 单分派泛函数

functools.singledispatch 装饰器可以把整体方案拆分成多个模块,甚至可以为你无法修改的类提供专门的函数。使用 @singledispatch 装饰的普通函数会变成泛函数(generic function):根据第一个参数的类型,以不同方式执行相同操作的一组函数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注