浅谈对python装饰器的理解

Posted sun8419082

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈对python装饰器的理解相关的知识,希望对你有一定的参考价值。

1.概念:在不改变原函数结构的情况下,给函数体本身增加部分功能(常见如接口函数被调用时,自动打印接口被调用日志)

2.本质:装饰器的本质是一个闭包函数,而闭包函数的本质是变量作用域的外溢(外层函数中包裹的内部函数可使用外层函数的参数,以及接受其值)

3.分类:

  a.函数装饰器

def deco(func):                   #func即是要接收的被砖石的函数名
    def wrapper(*args,**kwargs):  #可以根据被装饰的函数需不需要传参,给被装饰的对象传入参数
        res=func(*args,**kwargs)  #本质就是调用被装饰的函数, 接收传进来的参数
        print("xyz")
        return res                #接收被装饰函数的返回值,没有则返回None
    return wrapper 

@deco
def sun(a):
    print(str(a))
    print("abc")
if __name__ == "__main__":
    sun(123)


输出结果:
123
abc
xyz

  b.装饰器类(实现了__init__和__call__方法的类)

import time
class Foo():
    def __init__(self,func):
        self.func = func
    
    def __call__(self):
        print("装饰函数开始运行...")
        start_time = time.time()
        print(start_time)
        self.func()
        end_time = time.time()
        print("装饰完成...")
        print(end_time)
@Foo
def sun():
    print("执行sun函数...")

if __name__ == "__main__":
    sun()
输出:
装饰函数开始运行...
1592806290.9291573
执行sun函数...
装饰完成...
1592806290.9291573

  c.装饰器类接受被装饰函数的多个参数

class Cho:
    def __init__(self,name):
        self.name = name

    def __call__(self,func):
        def wrapper(*args,**kwargs):
            print(----,self.name)
            return func(*args,**kwargs)
        return wrapper

 

以上是关于浅谈对python装饰器的理解的主要内容,如果未能解决你的问题,请参考以下文章

浅谈对JIT编译器的理解

浅谈对递归算法的理解……

浅谈对软件工程的认识与理解

浅谈对Js面向对象的理解

浅谈对ControllerAdvice注解的理解

浅谈Python装饰器