1 #闭包
2 #1,函数内定义了一个函数,内部函数使用了外部函数的局部变量,外部函数返回内部函数名
3 #2,定义一个变量func,值等于调用外部函数返回的返回值wrapper
4 #3,调用func()
5 #这一整个的过程称为闭包
6
7 def closed_pack():
8 num = 1
9 def wrapper():
10 print(num)
11 return wrapper
12
13 func = closed_pack()
14 func()
15
16 #原函数只有打印的功能
17 #现在想给原函数增加新的功能
18 #可以通过闭包来实现
19
20 def closed_package(origin_func):
21 def add_new_print():
22 print("add_new_print")
23 origin_func()
24 return add_new_print
25
26 def origin_func():
27 print("origin func")
28
29 func = closed_package(origin_func)
30 func()
31
32 #装饰器
33 ####################################
34 # 以下代码是装饰器 #
35 # #
36 ####################################
37 #通过闭包增加新功能
38 def wrapper(old_func):
39 def add_new_methods():
40 print("在原来函数增加新的打印")
41 old_func()
42 return add_new_methods
43
44 def origin_fun():
45 print("origin func")
46
47 func = wrapper(origin_fun)
48 func()
49
50 #通过闭包增加新功能,原函数有多个参数
51 def wrapper(old_func):
52 def add_new_methods(*args, **kwargs):
53 print("在原来函数增加新的打印")
54 old_func(*args, **kwargs)
55 return add_new_methods
56
57 def origin_fun(num, str):
58 print("origin func",num,str)
59
60 func = wrapper(origin_fun)
61 func(1,"lili")
62
63 #通过闭包增加新功能,原函数有多个参数,并且有返回值
64 def wrapper(old_func):
65 def add_new_methods(*args, **kwargs):
66 print("在原来函数增加新的打印")
67 return old_func(*args, **kwargs)
68 return add_new_methods
69
70 def origin_fun(num, str):
71 print("origin func",num,str)
72 return num, str
73
74 func = wrapper(origin_fun)
75 func(1,"lili")
76
77 #装饰器
78 def wrapper(old_func):
79 def add_new_methods(*args, **kwargs):
80 print("在原来函数增加新的打印")
81 return old_func(*args, **kwargs)
82 return add_new_methods
83
84 @wrapper #在原函数处拦截原函数的调用,增加新的功能
85 def origin_fun(num, str):
86 print("origin func",num,str)
87 return num, str
88
89 origin_fun(1,"lili")
90
91 #装饰器 接收原函数的返回值
92 def wrapper(old_func):
93 def add_new_methods(*args, **kwargs):
94 print("在原来函数增加新的打印")
95 return old_func(*args, **kwargs)
96 return add_new_methods
97
98 @wrapper #在原函数处拦截原函数的调用,增加新的功能
99 def origin_fun(num, str):
100 print("origin func",num,str)
101 return num, str
102
103 n, s = origin_fun(1,"lili")
104 print(n,s)