怎么理解python中的装饰器(小白通俗理解)
今天学习了python中的装饰器,我来说一说我对python装饰器的理解。
作用
它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能。
用途
- 应用于缓存、
- 权限校验(如django中的@login_required和@permission_required装饰器)
- 性能测试(比如统计一段程序的运行时间)
- 插入日志等应用场景
- python-web框架中的路由功能也用到了装饰器
装饰器用到的知识点
- 嵌套函数
如果在一个函数的内部还定义了另一个函数(注意: 是定义,不是引用!),这个函数就叫嵌套函数。 - 闭包(Closure)
闭包是Python编程一个非常重要的概念。如果一个外函数中定义了一个内函数,且内函数体内引用到了体外的变量,这时外函数通过return返回内函数的引用时,会把定义时涉及到的外部引用变量和内函数打包成一个整体(闭包)返回。
一般一个函数运行结束的时候,临时变量会被销毁。但是闭包是一个特别的情况。当外函数发现,自己的临时变量会在将来的内函数中用到,自己在结束的时候,返回内函数的同时,会把外函数的临时变量同内函数绑定在一起。
通用的装饰器
def hint(func):
def wrapper(*args, **kwargs):
print('{} is running'.format(func.__name__))
return func(*args, **kwargs)
return wrapper
@hint
def hello():
print("Hello!")
装饰器在路由当中的使用
def route(url):
def set_func(func):
# URL_FUNC_DICT["/index.html"] = index
URL_FUNC_DICT[url] = func
def call_func(*args, **kwargs):
return func(*args, **kwargs)
return call_func
return set_func
@route("/index.html")
def index():
with open("./templates/index.html") as f:
content = f.read()
my_stock_info = "哈哈哈哈"
content = re.sub(r"\{%content%\}", my_stock_info, content)
return content