装饰器

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数的功能镜像扩展

语法糖:

 1 import time
 2 def timer(func):
 3     def inner():
 4         start = time.time()
 5         func()
 6         print(time.time() - start)
 7     return inner
 8 @timer   #==> func1 = timer(func1)   ===>语法糖
 9 def func1():
10     print('in func1')
11 func1()
12 
13 装饰器——语法糖
View Code

开放封闭原则:对扩展开放,对修改封闭

1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

  2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

装饰器的主要功能和固定格式:

功能:在不改变函数的调用方式的基础上在函数前后添加某些功能

固定格式:

1 def timer(func):
2     def inner(*args,**kwargs):
3         '''执行函数之前要做的'''
4         re = func(*args,**kwargs)
5         '''执行函数之后要做的'''
6         return re
7     return inner
固定万能格式

带参数的装饰器:

 1 def outer(flag):
 2     def timer(func):
 3         def inner(*args,**kwargs):
 4             if flag:
 5                 print('''执行函数之前要做的''')
 6             re = func(*args,**kwargs)
 7             if flag:
 8                 print('''执行函数之后要做的''')
 9             return re
10         return inner
11     return timer
12 @outer(False)
13 def func():
14     print(111)
15 func()
View Code

多个装饰器修饰同一个函数:

 1 def wrapper1(func):
 2     def inner():
 3         print('wrapper1 ,before func')
 4         func()
 5         print('wrapper1 ,after func')
 6     return inner
 7 def wrapper2(func):
 8     def inner():
 9         print('wrapper2 ,before func')
10         func()
11         print('wrapper2 ,after func')
12     return inner
13 @wrapper2
14 @wrapper1
15 def f():
16     print('in f')
17 f()
View Code

 

posted @ 2017-07-29 12:31 前方、有光 阅读(...) 评论(...) 编辑 收藏