Click to Visit Homepage : zzyzz.top


Decorator - 装饰器

 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             实际的情况是, 更多的时候装饰器函数通常在一个模块中被定义, 然后被应用到其他模块儿中的对象上.

 

posted @ 2017-09-15 14:29  zzYzz  阅读(177)  评论(0)    收藏  举报


Click to Visit Homepage : zzyzz.top