python装饰器的参数传递
被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行)(把被装饰的原函数引用赋值给了装饰器内部的那个函数名),当下边通过该函数名调用时,会调用到装饰器内部的那个函数()
装饰器:在不修改函数源代码的基础上,添加函数功能
一个简单的装饰器
?
|
1
2
3
4
5
6
7
8
9
10
11
|
def log_time(func):
def make_decorater():
print('现在开始装饰')
func()
print('现在结束装饰')
return make_decorater
@log_time
def test():
print('我是被装饰的函数')
test()
|
?
|
1
2
3
4
5
6
|
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰
Process finished with exit code 0
|
当被装饰的函数有形参时
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def log_time(func):
def make_decorater(*args,**kwargs):
print('现在开始装饰')
test_func = func(*args,**kwargs)
print('现在结束装饰')
return test_func
return make_decorater
@log_time
def test(num):
print('我是被装饰的函数')
return num+1
a = test(2)
print(a)
|
?
|
1
2
3
4
5
6
7
|
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰
3
Process finished with exit code 0
|
当@装饰器后有参数时
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def get_parameter(*args,**kwargs):
def log_time(func):
def make_decorater():
print(args,kwargs)
print('现在开始装饰')
func()
print('现在结束装饰')
return make_decorater
return log_time
@get_parameter('index.html/')
def test():
print('我是被装饰的函数')
test()
|
?
|
1
2
3
4
5
6
7
|
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
('index.html/',) {}
现在开始装饰
我是被装饰的函数
现在结束装饰
Process finished with exit code 0
|
两个装饰器同时修饰一个函数(重点看执行顺序)
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
def log_time1(func):
def make_decorater(*args,**kwargs):
print('1现在开始装饰')
test_func = func(*args,**kwargs)
print('1现在结束装饰')
return test_func
return make_decorater
def log_time2(func):
def make_decorater(*args,**kwargs):
print('2现在开始装饰')
test_func = func(*args,**kwargs)
print('2现在结束装饰')
return test_func
return make_decorater
@log_time1
@log_time2
def test(num):
print('我是被装饰的函数')
return num+1
a = test(2)
print(a)
|
?
|
1
2
3
4
5
6
7
8
9
|
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
1现在开始装饰
2现在开始装饰
我是被装饰的函数
2现在结束装饰
1现在结束装饰
3
Process finished with exit code 0
|
注意看执行结果(print,只有执行就会输出到屏幕)(return将数据返回给接受的变量或引用)
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def makeBold(fn):
def wrapped1():
print('1')
b = "" + fn() + ""
return wrapped1
def makeItalic(fn):
def wrapped():
print('2')
a = return "" + fn() + ""
return wrapped
@makeBold
@makeItalic
def test3():
return "hello world-3"
a = test3()
print(a)
|
?
|
1
2
3
4
5
6
|
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/text.py
1
2
2end
1end
hello world-3</i></b>
Process finished with exit code 0
|