Python基础篇【第九篇】:剖析装饰器

装饰器:
装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.
剖析装饰器:
#!/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:UsersAdministratorAppDataLocalProgramsPythonPython35python.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
以乘法的方式进行运算!

  

  

原文地址:https://www.cnblogs.com/allan-king/p/5494377.html