装饰器
一、装饰器的简单介绍
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)
二、装饰器装饰带两个参数的函数
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)
三、多个装饰器装饰一个函数
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)