一、装饰器的简单介绍
代码语言:javascript复制 1 # /usr/bin/env python
2 # -*- coding:utf-8 -*-
3 ''' 装饰器 '''
4 ''' 5 装饰器的工作原理
6 1. python的执行顺序是从上到下顺序执行.
7 2. 当执行到outer函数的时候, 将其内容放入内存, 执行到f1的时候.在f1上发现@outer装饰器.
8 3. 执行outer函数, 并将其下的函数名f1作为参数传递给outer
9 4. 将outer的返回值赋值给f1. 即f1=outer的返回值. 也就是f1重新指向outer的返回值
10 5. outer的返回值inner是函数, 也就是outer返回了一个函数. f1指向outer返回的inner函数.
11 6. 在后面调用f1(), 即调用inner()执行函数. 执行inner函数的内容.
12 7. 在inner函数中调用执行了func函数. func=原来的f1函数 , 调用func(),即执行原来的f1函数.返回结果r
13 8. inner的返回值是r, 新的f1函数的返回值也是r. 因此可以获得返回值, 并打印输出
14 8. 由于f1函数没有返回值, 默认返回none. 因此后来的f1函数的返回值是None.
15 '''
16
17
18 def outer(func):
19 def inner():
20 print("hello")
21 print( "hello" )
22 print( "hello" )
23 r = func()
24 print("end")
25 print( "end" )
26 print( "end" )
27 return r
28 return inner
29
30 @outer
31 def f1():
32 print("FF1")
33
34
35 r = f1()
36 print(r)
二、装饰器装饰带两个参数的函数
代码语言:javascript复制 1 # /usr/bin/env python
2 # -*- coding:utf-8 -*-
3 '''装饰器_带有多个参数'''
4
5 #定义装饰器的时候,带有两个参数*args,**kwargs.可以用来接收动态参数.
6 def outer(func):
7 def inner(*args, **kwargs):
8 print("Hello")
9 r = func(*args, **kwargs)
10 print("End")
11 return r
12 return inner
13
14 @outer
15 def f1(a,b):
16 print("执行带参数的函数")
17 return a b
18
19 r = f1(1,2)
20 print(r)
三、多个装饰器装饰一个函数
代码语言:javascript复制 1 # /usr/bin/env python
2 # -*- coding:utf-8 -*-
3 '''多个装饰器装饰一个函数'''
4
5 def outer(func):
6 """
7 装饰器1
8 :param func:
9 :return:
10 """
11 def inner(*args, **kwargs):
12 print("begin")
13 r = func(*args, **kwargs)
14 print("end")
15 return r
16 return inner
17
18 def outer_1(func):
19 """
20 装饰器2
21 :param func:
22 :return:
23 """
24 def inner(*args, **kwargs):
25 print("predict")
26 r = func(*args, **kwargs)
27 return r
28 return inner
29
30
31
32
33 @outer_1
34 @outer
35 def f1(a1, a2, a3):
36 """
37 为这个函数使用两个装饰器
38 :param a1:
39 :param a2:
40 :param a3:
41 :return:
42 """
43 print("f1函数")
44 return a1 a2 a3
45
46 f1(1,2,3)