标签:
装饰器:
装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.
剖析装饰器:
#!/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
以乘法的方式进行运算!
标签:
原文地址:http://www.cnblogs.com/allan-king/p/5494377.html