分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter
装饰器,顾名思义,就是增强函数或类的功能的一个函数。它可以在不改变一个函数代码和调用方式的情况下,给函数添加新的功能。
Python的装饰器本质上是一个嵌套函数,它接受被装饰的函数(func)作为参数,并返回一个包装过的函数。这样我们可以在不改变被装饰函数的代码的情况下给被装饰函数或程序添加新的功能。Python装饰器广泛用于缓存、权限校验(如django的@login_required和@permission_required装饰器)、性能测试(比如统计一段程序的运行时间)和插入日志等场景应用。
Python装饰器的工作原理主要依赖于嵌套函数和闭包。
嵌套函数:
如果在一个函数的内部还定义了另一个函数(注意:是定义,不是引用!),这个函数就叫嵌套函数。外部的我们叫它外函数,内部的我们叫它内函数。
闭包(Closure):
闭包是Python编程一个非常重要的概念。如果一个外函数中定义了一个内函数,且内函数体内引用到了体外的变量,这时外函数通过return返回内函数的引用时,会把定义时涉及到的外部引用变量和内函数打包成一个整体(闭包)返回。看如下例子:
def outer(x):
a = x
def inner(y):
b = y
print(a+b)
return inner
f1 = outer(1) # 返回inner函数对象+局部变量1(闭包)。
f1(10) # 相当于inner(10),输出11。
注:我们的outer方法返回的只是内函数对象吗? 错。我们的outer函数返回的实际上是一个由inner函数和外部引用变量a组成的闭包!
定义装饰器:
from functools import wraps
def decorator(func):
@wraps(func) #这个是为了被装饰的函数的.__name__属性不被改变
def wrapper(*args, **kwargs):
#可以自定义传入的参数
print(func.__name__)
#返回传入的方法名参数的调用
return func(*args, **kwargs)
return wrapper
装饰器可以传参(采用三层函数定义装饰器),也可以不用传参(采用两层函数定义装饰器)。
无参装饰器:
带参装饰器:
装饰器的应用场景:
1)给函数加日志。
2)计算函数执行时间。
3)授权,检查某个人是否被授权去使用一个web应用的端点(endpoint),装饰器被大量使用于Flask和Django web框架中。