Python装饰器实战

布满荆棘的人生 2023-10-04 17:13 21阅读 0赞

写在前面
python的装饰器是一种语法糖,是在不改变原有代码的前提下进行 追加新功能,如:登陆鉴权…
装饰器由闭包实现
闭包
闭包三要素
1.函数嵌套, 即外部函数嵌套一个内部函数;
2.外部函数返回内部函数引用;
3.内部函数使用外部函数的变量或者形参
闭包范例
def out(func):
variable = ‘This is out variable’
def inner():
print(variable)
func()
return inner
1
2
3
4
5
6
函数装饰器
1 简单装饰器
import functools

def out(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner

@out
def func(*args, **kwargs):
pass
return
1
2
3
4
5
6
7
8
9
10
11
12
2 带参数的装饰器
== 常见如 FastApi Flask 等定义接口的方式便是采用这种带参数的装饰器来规定请求方式的==
import functools

def Out(*args, **kwargs):
def out(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func()
return inner
return out

# 常见的 如 FastApi Flask 等定义接口的方式便是采用这种带参数的装饰器来规定请求方式的
@Out(‘post’)
def func():
pass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3 函数装饰器应用实例
我们定义一个登录和鉴权装饰器来装饰api
# 1.定义登录认证装饰器
import functools

def authenticated(func):
@functools.wraps(func)
def inner1(*args, **kwargs):
print(‘登录认证代码’)
res = func(*args, **kwargs)
print(‘登录认证后执行’)

return res
return inner1

# 2.定义鉴权装饰器
def accesstoken(func):
@functools.wraps(func)
def inner2(*args, **kwargs):
print(‘鉴权代码’)
res = func(*args, **kwargs)
print(‘鉴权后执行’)
return res

return inner2

@authenticated
@accesstoken
def api():
print(‘api逻辑’)
return

api()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
类装饰器
类装饰器比之函数装饰器更好理解

1 简单装饰器
class Decorator():
def __init__(self, func):
self._func = func

def __call__(self, *args, **kwargs):
return self._func(*args, **kwargs)

@Decorator
def func(x):
return x

1
2
3
4
5
6
7
8
9
10
11
12
2 带参数的装饰器
import functools

class Decorator():
def __init__(self, method=None):
self._method = method

def __call__(self, func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

@Decorator(‘post’)
def func(x):
return x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3 类装饰器应用实例
pass
### 注意: 多个装饰器装饰同一个方法或者函数可以这样理解:
参考洋葱纹路,先从外到内再从内到外, 被装饰函数上层的代码属于从外到内, 被装饰函数下层的代码属于从内到外
我们以上面的函数装饰器实例为例:

api定义好后,此时装饰器函数立即执行,自下而上装饰api, 即 api= authenticated(accesstoken(api)) 拆解开来有如下步骤

api = accesstoken(api) —> inner2
api = authenticated(inner2) —> inner1
此时的 api为装饰后的 新api
调用 api, 此时有如下调用链
新api() —> inner1() [登录认证代码执行] - inner2() [鉴权代码执行] - api()[此时的api函数才是真正的初始定义的api] - 鉴权后执行 - [登录认证后执行], 如下

可以看到整个调用链有如洋葱纹理一样 自外而内 再 自内而外

结论: 一般的装饰器在装饰api函数时登录验证在上 鉴权在下, 意即, 先登录 再 鉴权
————————————————
版权声明:本文为CSDN博主「非-浪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin\_43380311/article/details/104482294

发表评论

表情:
评论列表 (有 0 条评论,21人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python实战小程序——装饰

    简述对Python装饰器的理解,写一个简单的装饰器。 要理解装饰器,我们先介绍一下几点python的基础知识。 1、作用域(命名空间)及变量生存周期 有过一点编程基

    相关 Python装饰

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:

    相关 [Python]装饰

    > Python中利用@符号可以很容易实现函数装饰器的功能,本文就这些用法做一些简单的总结。 介绍 Python中由于函数本身也可以当作变量来使用,因此可以直接将函数作

    相关 python装饰

    装饰器,人如其名,就是给成添加附功能的手段,但是该代码已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足下面两点:

    相关 python装饰

    1. 闭包函数   在看装饰器之前,我们先来搞清楚什么是闭包函数。python是一种面向对象的编程语言,在python中一切皆对象,这样就使得变量所拥有的属性,函数也同样拥

    相关 python装饰

    Python2.4开始提供装饰器(decorator),适当使用装饰器可以有效提高代码可读性和可维护性。装饰器的本质就是一个函数,这个函数接受其他函数作为参数,并将其以一个新的

    相关 python 装饰

    装饰器介绍 装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在P