原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类
一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式
二:装饰器的用途
(1)增强一个组件向另一个组件发送数据时的响应能力
(2)支持多种可选行为
(3)对一个单元做代码上的修改(即代码的复用)
1 import time 2 3 # ----------------------------------------------------------------# 4 # 装饰器一 5 # ----------------------------------------------------------------# 6 7 8 def f1(): 9 print("Local time is ") 10 # print(time.time()) 11 12 13 def f2(): 14 print("Local time is ") 15 # print(time.time()) 16 17 18 f1() 19 f2() 20 21 # 给每一个函数添加一个打印当前时间,做下面的修改,没有违反修改是封闭的原则 22 23 24 def print_current_time(func): 25 print(time.time()) 26 func() 27 28 29 print_current_time(f1) 30 print_current_time(f2) 31 32 # 抛出问题 打印时间是函数本身的,并不是强加函数 33 34 # ----------------------------------------------------------------# 35 # 装饰器二 36 # ----------------------------------------------------------------# 37 38 39 def decorator(func): 40 def wrapper(): # 被封装的意思 41 print(time.time()) 42 func() 43 return wrapper 44 45 46 def f1(): 47 print("This is a function:") 48 49 50 f = decorator(f1) # 将函数f1装饰 51 f() # 执行装饰后的结果 52 53 54 # ----------------------------------------------------------------# 55 # 装饰器三 56 # ----------------------------------------------------------------# 57 58 59 def decorator(func): 60 def wrapper(): # 被封装的意思 61 print(time.time()) 62 func() 63 return wrapper 64 65 66 @decorator 67 def f1(): 68 print("This is a function:") 69 70 71 f1() # 不改变函数的调用 72 73 74 # ----------------------------------------------------------------# 75 # 装饰器四 76 # ----------------------------------------------------------------# 77 78 def hello(fn): # fn为回调函数 79 def wrapper(): 80 print('hello, %s' % fn.__name__) 81 fn() 82 print('goodbye, %s' % fn.__name__) 83 return wrapper 84 85 86 @hello 87 def foo(): 88 print("I am a foo") 89 90 91 foo() 92 93 94 # ----------------------------------------------------------------# 95 # 装饰器五之装饰器终极形态 96 # ----------------------------------------------------------------# 97 98 99 def decorator(func): 100 def wrapper(*func_name, **kw): # 被封装的意思 101 print(time.time()) 102 func(*func_name, **kw) # 处理抽象函数 103 return wrapper 104 105 106 @decorator 107 def f_1(func_name): 108 print("This is a function:" + func_name) 109 110 111 @decorator 112 def f_2(func_name1, func_name2): # 多参数函数 113 print("This is a function:" + func_name1 + func_name2) 114 115 116 @decorator 117 def f_3(func_name1, func_name2, **kw): 118 print("This is a function:" + func_name1 + func_name2) 119 print(kw) 120 121 122 def f_4(func_name1, func_name2, **kw): 123 print("This is a function:" + func_name1 + func_name2) 124 print(kw) 125 126 127 f_1('qqq') # 不改变函数的调用 128 f_2('aa', 'dd') 129 f_4('aa', 'dd', a=1, b=2, c=3) 130 f_3('aa', 'dd', a=1, b=2, c=3)
一步一步理解装饰器,装饰器特别好用!