原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类
一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式
二:装饰器的用途
(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)
一步一步理解装饰器,装饰器特别好用!