python学习笔记--装饰器调用过程

"""
python的装饰器
情景:要对所有的对外访问的接口,做权限拦截,即有访问权限的才会通过,没有访问权限的不让其访问。但是访问接口已经写好,又不能将权限拦截写在访问接口的里面,此时可以用
装饰器来满足这个要求了。
已经实现的功能代码不允许被修改,但可以被扩展,即:
封闭:已实现的功能代码块
开放:对扩展开发


"""

def decorator_1(func):

    print("----------装饰器1----------start")

    def dec_1_inner():
        print("------拦截权限1----")
        func()
        print("-----装饰器1-inner-------")

    print("----------装饰器1----------end")
    return dec_1_inner


def decorator_2(func):
    print("----------装饰器2----------start")

    def dec_2_inner():
        print("------拦截权限2----")
        func()
        print("-----装饰器2-inner-------")

    print("----------装饰器2---------- end")
    return dec_2_inner

# 装饰器的作用:
# func1 = decorator_1(func1)
# func1 = decorator_2(func1)
@decorator_1
@decorator_2
def func1():
    print("----函数---func1---")


# func1 = decorator_1(func1)
func1()

"""
分析:
装饰器装饰是从下往上装饰的,即python解释器在遇到上面的@decorator_1,@decorator_2会自动装饰,即在调用前已经装饰好了
可以从打印结果可以看出:
1.刚开始时先装饰 func1 = decorator_2(fuc1),而decorator_2(),将func1传进去,此时dec_1_inner()里面的func()指向的是外部定义的func1()函数,return dec_2_inner,即此时func1指向了dec_2_inner
2.由于装饰decorator_2完成后返回指向func1,所以会将func1作为参数传入到decorator_1中,即func1 = decorator_1(func1)
3.然后开始装饰func1 = decorator_1(func1),decorator_1()将func1作为参数传进去,此时dec_1_inner()里面的func()指向的是func1()函数,然而由于执行了步骤1,func1 = dec_2_inner,所以func指向了dec_2_inner,装饰完后return dec_1_inner;func1又改指向返回的dec_1_inner
4.当函数调用func1()执行的时候,func1-->dec_1_inner-->dec_2_inner,由执行结果 也可以看出,dec_2_inner执行完成后,执行了“-----装饰器2-inner-------”,返回后,执行了dec_1_inner()中的“-----装饰器1-inner-------”
"""

原理分析:


运行结果:

----------装饰器2----------start
----------装饰器2---------- end
----------装饰器1----------start
----------装饰器1----------end
------拦截权限1----
------拦截权限2----
----函数---func1---
-----装饰器2-inner-------
-----装饰器1-inner-------



猜你喜欢

转载自blog.csdn.net/u011662320/article/details/80978902