浅谈python中的装饰器

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.****.net/kun1280437633/article/details/79520261

1、要想了解装饰器,首先要知道什么是闭包?

    内部函数调用外部函数的变量 (闭包是完成一段功能时需要一个保持一个数据)

    一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。

闭包的写法 (两层函数的嵌套,外部函数返回内部函数的引用,外层函数都带参数)

        def 外层函数的名称(参数):

             def 内层函数的名称():

                 pass

             return  内层函数的引用

2、装饰器(用来装饰函数,在不改变函数的情况下去做一些功能)的写法

(1)先写闭包

(2)在要装饰的函数上@闭包的外部函数名

例子

def set_fun(func):
    def call_fun():
        print("执行前")
        func()  # func指向是装饰前的函数
        print("执行后")

    return call_fun

# @名称就叫装饰器
@set_fun  # test = set_fun(test)
def test():

    print("test")

test()  # 总结: 装饰前的函数由func指向 ,装饰后的函数由闭包的内部函数引用了(call_fun)

3、万能装饰器的写法(装饰的函数有无参数,有无返回值)及原理图解

def set_fun(func):
    def call_fun(*args,**kwargs):
        return  func(*args,**kwargs)
    return call_fun

浅谈python中的装饰器

4、多个装饰器装饰一个函数的写法及其图解(口诀:先进后出,先外后内

def set_fun1(func):
    print("set_fun1")
    def call_fun(*args,**kwargs):
        print("call_fun1")
        return func(*args,**kwargs)

    return call_fun

def set_fun2(func):
    print("set_fun2")
    def call_fun(*args,**kwargs):
        print("call_fun2")
        return func(*args,**kwargs)

    return call_fun

@set_fun2  # test = set_fun2(test)
@set_fun1  # test = set_fun(test)
def test():
    print("test")

test()

浅谈python中的装饰器

4、装饰器中传入参数

def set_args(data):
    print(data)
    def set_fun(func):
        print("222")
        def call_fun(*args, **kwargs):
            print("333")
            return func(*args, **kwargs)
        return call_fun
    return set_fun



@set_args(444)  #第一步set_args("num")执行,他的返回肯定是装饰器的引用(set_fun),第二步@set_fun就跟上面是一样的
def test():
    print("555")

test()

# 结果:444   222  333  555