装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
这里举一个简单例子,例如,小琨要吃冰激凌,小明要吃冰果,小王要吃老冰棍
1 # -*- coding utf-8 -*- 2 3 def a(): 4 print("小琨吃冰激凌") 5 6 def b(): 7 print("小明吃冰果") 8 9 def c(): 10 print("小王吃老冰棍") 11 12 a() 13 b() 14 c() 15 16 17 小琨吃冰激凌 18 小明吃冰果 19 小王吃老冰棍
但是他们吃之前没有洗手,三个人都要先洗手再吃,在不修改原有函数下:
1 # -*- coding utf-8 -*- 2 3 def first(func): 4 def inner(): 5 print("先洗手") 6 return func() 7 return inner 8 9 @first 10 def a(): 11 print("小琨吃冰激凌") 12 13 @first 14 def b(): 15 print("小明吃冰果") 16 17 @first 18 def c(): 19 print("小王吃老冰棍") 20 21 a() 22 b() 23 c() 24 25 26 先洗手 27 小琨吃冰激凌 28 先洗手 29 小明吃冰果 30 先洗手 31 小王吃老冰棍
如果被装饰的函数需要带参数的情况下:
1 # -*- coding utf-8 -*- 2 3 def first(func): 4 def inner(arg): 5 print("先洗手") 6 return func(arg) 7 return inner 8 9 @first 10 def a(aaa): 11 print("小琨吃冰激凌,%s"%aaa) 12 13 @first 14 def b(bbb): 15 print("小明吃冰果,%s"%bbb) 16 17 @first 18 def c(ccc): 19 print("小王吃老冰棍,%s"%ccc) 20 21 a("不洗手,以后剁手") 22 b("不洗手,以后剁手") 23 c("不洗手,以后剁手") 24 25 26 先洗手 27 小琨吃冰激凌,不洗手,以后剁手 28 先洗手 29 小明吃冰果,不洗手,以后剁手 30 先洗手 31 小王吃老冰棍,不洗手,以后剁手