2022.12.28 装饰器
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。参数可以是函数,返回值也可以是函数。
def decorator(fn):
def wrapper(name):
print(name+"say I'm in") # 这是我的前处理
return fn(name)
return wrapper
@decorator
def outer_fn(name):
print(name+"say I'm out")
outer_fn("mofanpy")
@decorator
这就是装饰器
@decorator
def outer_fn(name):
相当于
decorator(outer_fn(name))
outer_fn("mofanpy")
@decorator
下面,所以是个装饰器,相当于decorator(outer_fn(name))
decorator()
返回的是wrapper()
,所以实际执行的是wrapper(mofanpy)
fn("mofanpy")
也就是outer_fn("mofanpy")
,输出:mofanpysay I’m out【结果】
mofanpysay I'm in
mofanpysay I'm out
【实例1】:在写装饰器的时候,装饰器就被调用
def funA(fn):
print("调用funB前")
def new_fun(arg):
print("增加的内容:",arg)
print("调用funB后")
return new_fun # 如果返回fn就是返回funB()的结果
@funA
def funB(arg):
print("funB被调用",arg)
print("============")
funB("funB1")
funB("funB2")
【说明】
@funA
def funB(arg):
funA(funB(arg))
,此时输出了:调用funB前
调用funB后
并返回了new_fun()
函数。
print("============")
funB("funB1")
funB("funB2")
相当于执行
print("============")
new_fun("funB1")
new_fun("funB2")
调用funB前
调用funB后
============
增加的内容: funB1
增加的内容: funB2
【实例2】:输出什么顺序
#funA 作为装饰器函数
def funA(fn):
print("调用funB前")
fn() # 执行传入的fn参数
print("调用funB后")
return fn # 如果返回fn就是返回funB()的结果
@funA
def funB():
print("funB被调用")
【说明】
def new_fun(arg):
定义了函数,所以先执行了print("调用funB后")
.当实例调用这个装饰器时候,才输出返回值。fn()
的时候,有print,所以在定义装饰器的时候全输出顺序如下,在中间。调用funB前
funB被调用
调用funB后
我这个也是直接抄过来,没有实际运用过。基本上是要做同样的前置处理或后置处理的时候
装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权
参考
https://zhuanlan.zhihu.com/p/593088978
https://www.runoob.com/w3cnote/python-func-decorators.html