【python3】10.python高阶内容:装饰器

10.python高阶内容:装饰器

2022.12.28 装饰器

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。参数可以是函数,返回值也可以是函数。

10.1 形式

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))

【python3】10.python高阶内容:装饰器_第1张图片
【解释过程】

  • ① 我们输入:outer_fn("mofanpy")
  • ② 这个函数在@decorator 下面,所以是个装饰器,相当于decorator(outer_fn(name))
  • decorator()返回的是wrapper(),所以实际执行的是wrapper(mofanpy)
  • ④ 执行print,输出:mofanpysay I’m in
  • ⑤执行return,返回fn("mofanpy")也就是outer_fn("mofanpy"),输出:mofanpysay I’m out

【结果】

mofanpysay I'm in
mofanpysay I'm out

10.2 实例讲解

【实例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后

10.3 用在哪里

我这个也是直接抄过来,没有实际运用过。基本上是要做同样的前置处理或后置处理的时候

  • 授权(Authorization)

装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权

  • 日志(Logging)

参考
https://zhuanlan.zhihu.com/p/593088978
https://www.runoob.com/w3cnote/python-func-decorators.html

你可能感兴趣的:(python学习,python,装饰器)