装饰器

2022-05-06 14:40:46 浏览数 (1)

 一、装饰器的简单介绍

代码语言: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)

0 人点赞