装饰器:装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.剖析装饰器:
#!/usr/bin/env python3 ‘‘‘ 装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数. 表现形式: def outer(): def inner(): print("xxx") return test return inner @outer def f1(): pass f1() ‘‘‘ # def outer(func): # def inner(*args, **kwargs): # print("123") # ret = func(*args, **kwargs) # #print(ret) # print("456") # return ret # return inner def outer_0(func): def inner(*args, **kwargs): print("3.5") ret = func(*args, **kwargs) print(ret) return ret return inner @outer_0 # @outer def index(a1,a2): print("这是index函数的内容!") return a1 + a2 # ret = index(1,2) # print(ret) index(1,2) # @outer_0 # def f1(): # print("F1") # return "aaaaa" # f1() ‘‘‘ 以上装饰器执行经过剖析: 1.程序开始执行,看到函数"def outer(func)",不会执行,并把此函数放入到内存中去,然后继续往下执行. 2.看到函数"def outer_0(func):"放入到内存中,不会执行. 3.往下执行的时候看到@outer_0并会执行此函数,然后解释器会把@outer_0下面的函数"index"当做实参传入到"outer_0"函数中的形参"func"里,所以现在"index" = "func" def outer_0(index): #拿到index函数,把它当做实参传入到函数中 def inner(1, 2): #第二级函数(它会从一级函数中找到相应的值传进来,而这个inner就会把index的参数给传进来),形体参数对应着实体参数所以*args = 1, ##kwargs = 2 print("3.5") #自己函数体的值 print("这是index函数的内容!") #从index函数中拿到的值 ret = func(1, 2) #在这赋值一个变量ret,然而这个变量的值是func(1, 2),why? because func就是index的返回值1, 2就是从index的实体参数 print(ret) #然后把这个返回值给输出出来 return ret #最后把返回值给上一层的函数 return inner 4.然后将outer_0的返回值重新定义给"index"函数,就是"index"等于"outer_0"的返回值!这一步就相当于重新创建了一个新的"index"函数!而这个新的"index"函数的内容,就是"outer_0"的返回值!("index" = "outer_0"的返回值) ‘‘‘
代码执行结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.exe D:/pycharm/obj/old_boy/day07/装饰器.py 3.5 这是index函数的内容! 3 Process finished with exit code 0
*注:多个执行多个装饰器的时候处理方式。
@outer @outer_0 def index(): print("test") index() #等于一下方式执行: (outer*index)*outer_0 (outer*outer_0)*index 以乘法的方式进行运算!
时间: 2024-10-22 21:57:58