Python之装饰器的学习

    技术2022-07-11  73

    在了解完闭包之后,相信大家已经对闭包这个概率已经有了一些认识,而我们下面所学的装饰器这个知识点则是建立在闭包的基础之上。没有接触过闭包的童鞋请看我的博客(链接在文章底部)


    装饰器简介

    装饰器本质上是一个Python函数,它可以让其他函数在 不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个 函数对象。它经常用于有以下场景,比如:插入日志、性能测试、 事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

    好了,在了解完基本概念后,接下来直接带领大家从代码的角度认识一下:

    实现简单的日志功能:

    首先用闭包来实现这个功能:

    import time def writeLog(func): try: with open('log.txt', 'a', encoding = 'utf-8') as f: # 打印参数名字 f.write(func.__name__) f.write('\t') # 写入时间 f.write(time.asctime()) f.write('\n') except Exception as e: print(e) # 闭包 def funcOut(func): def funcIn(): # 内部函数调用外部参数 writeLog(func) func() return funcIn def func1(): print('My name is a') def func2(): print('My name is b') func1 = funcOut(func1) func2 = funcOut(func2) func1() func2()

    在上面的代码中,我们仅仅写入了俩个函数的基本内容。可是假设我们要写100个函数呢,又或者1000个函数呢,我们这个时候不可能写100个,1000个  func1 = funcOut(func1)  之类的代码。那么怎么办呢,答案当然是用装饰器来解决这个问题。


    import time def writeLog(func): try: with open('log.txt', 'a', encoding = 'utf-8') as f: # 打印参数名字 f.write(func.__name__) f.write('\t') # 写入时间 f.write(time.asctime()) f.write('\n') except Exception as e: print(e) # 闭包 def funcOut(func): def funcIn(): # 内部函数调用外部参数 writeLog(func) func() return funcIn @funcOut def func1(): print('My name is a') @funcOut def func2(): print('My name is b') # func1 = funcOut(func1) # func2 = funcOut(func2) func1() func2()

    我们发现,修改后的代码仅仅多了俩个@funcOUt,这个的作用就和func2 = funcOut(func2)的作用一样。运行,会发现依旧可以实现功能。


     

    小结: 装饰器与闭包是息息相关的,二者通常会结合使用。而且 @ 后面的代码是闭包函数的外部函数名称,如果不是,代码会报错。

     

    闭包的链接: https://mp.csdn.net/console/editor/html/107073175

    Processed: 0.011, SQL: 9