什么是装饰器?
装饰器实质上是闭包的一种特殊状态,闭包中我们一般传入的是自由变量,而在装饰器中,我们传入的是一个函数对象,并在闭包中对函数做一些额外处理。
装饰器的作用是什么?
装饰器的作用是给写好的函数添加额外的功能。
常见的使用场景有哪些?
比如,打印日志,验证用户是否已登录,flask中的路由函数(@app.route())等等。
请你手写一个装饰器,它的作用是将执行了哪些函数打印出来,并解释它的用法
import logging
def log(func):
def wrap(*args):
func()
logging.warn("execute function'{}'".format(func.__name__))
return wrap
@log
def login():
print("login function.")
@log
def logout():
pass
@log
def modify_form():
pass
login()
logout()
modify_form()
![](https://img.haomeiwen.com/i2779961/62fc057904961488.png)
首先导入了logging模块,用于打印日志使用。(注意,在脚本中,只有在日志级别>=warning时会显示。所以这里采用warn级别)
随后定义了log函数,并在log函数内部定义了闭包wrap,将要执行的函数func作为自由变量传入进来,并在闭包内执行,然后打印执行日志。
最终,返回闭包wrap。
所以,我们将打印日志的功能和业务逻辑解耦,这样的设计可以在不改动原有代码的情况下添加功能,有利于程序的可维护性。
网友评论