1. 什么是装饰器
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:
观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处:
调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志:
经过decorator装饰之后的函数,它们的__name__已经从原来的'now'变成了'wrapper'。需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:
2. python内置装饰器
2.1 @property
把类的一个方法变成属性调用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。
2.2 @staticmethod和@classmethod
The Static methods are used to do some utility tasks, and class methods are used for factory methods. The factory methods can return class objects for different use cases (不同参数的构造函数).