1 装饰器 Decorator,
2
3 先来看看对 decorator 这个名词的解释,
4 一个可调用的对象 A (decorator), 返回另一个可调用的对象 B, 在可调用的对象 C 的定义体之前通过语法 @A 调用.
5 Python 的解释器会调用 A(C), 把 C 的定义提替换成 B 并返回(return).
6 如果可调用对象 C 是函数, 那么将 A 称作 '函数装饰器(function decorator)'; 若 C 是类,则称 A 为 '类装饰器(class decorator)'.
7 decorator 的作用是对目标对象 C 进行'加工处理'(可以理解为对对象 C '增','删','改','查'等), 并返回处理处理后的新对象.
8
9 通过例子说明,
10 装饰器 decorator 是可以调用的对象, 其参数是另一个被装饰对象 object (class or function).
11 装饰器 可能会'加工'被装饰的对象, 然后把它返回, 又或者将其替换成另一个可以调用对象返回.
12
13 函数装饰器例子(function decorator),
14 def A(a,b):
15 print(a+b)
16 函数 A 直接打印 两个入参的和, 现在有这样一个需求,再打印结果(和)之前, 提示:'Start calculating the sum of a and b ...',
17 来看看这个需求如何通过 decorator 来实现.
18 def C(A): #1 传入 被调用对象
19 def innerC(a,b): #2 加工函数, 对被装饰对象 A 进行加工处理, 参数与目标对象 A 保持一直
20 print('Start calculating the sum of %d and %d' % (a,b)) #3 '需求' 的实现
21 return A(a,b) #4 将被装饰函数的调用返回,保证'闭环', 返回的是 对象 A 的 return 的对象(非必选的 return)
22 return innerC #5 将包装对象 A 的 函数返回(必选的return, 保证对对象 A 装饰后得到新对象是可调用的)
23
24 @C #6 装饰器语法
25 def A(a,b):
26 print(a + b)
27
28 A(1,3)
29
30 Output,
31 Start calculating the sum of 1 and 3 ... #3
32 4
33
34 类装饰器例子(class decorator),
35 同样地, 计算 a, b 的和, 用类来实现, 并将 decorator C 应用到这个类上, 看看输出结果如何,
36 @C
37 class A(object):
38 def __init__(self,a,b):
39 print(a + b)
40
41 Output,
42 Start calculating the sum of 3 and 5 ...
43 8
44 <__main__.A object at 0x038234D0>
45 # 同样, 通过 class decorator C 满足了在计算之前打印提示:'Start calculating the sum of a and b ...' 的需求.
46
47
48 注, 装饰器的一个关键特性是, 它们在被装饰的函数定义之后立即运行。通常是在导入时。
49 实际的情况是, 更多的时候装饰器函数通常在一个模块中被定义, 然后被应用到其他模块儿中的对象上.