
Python装饰器实战模板:提升开发效率的利器
大约 3 分钟
Python装饰器实战模板:提升开发效率的利器
装饰器是Python中最具魅力的特性之一,也是我在五年开发经验中使用频率最高的高级特性。它不仅能大大减少代码量,提高开发效率,更能让代码变得更加优雅和可读。
在实际项目中,虽然装饰器的应用场景很多,但常用的模式其实就那么几种。今天,我将分享一些在工作中反复使用、经过实战检验的装饰器模板,帮助大家快速掌握装饰器的实用技巧。
为什么装饰器如此重要?
在我的开发实践中,装饰器解决了以下核心问题:
- 代码复用:避免重复编写相同的功能代码
- 关注点分离:将业务逻辑与辅助功能分离
- 代码可读性:让代码意图更加清晰明确
- 维护性:统一管理横切关注点
基于之前在有道云笔记上的总结和实际工作经验,我整理了以下几种最常用的装饰器模式:
详细的可以看我这篇文章Python装饰器
我们一般是将装饰器放在一个文件中进行引用的,不需要放到类中内置,即使放到类中内置,一般情况下也是使用静态方法@staticmethod 来实现调用
装饰器@decorator 其实就是一个Python的魔法函数,可以等价替换如下:
@args_decorator(my_argument="test")
def func():
paas
等价于
func = args_decorator(my_argument="test")(func)是等价的。如果要弄懂装饰器是怎么回事,请了解闭包是什么,装饰器其实只是闭包的一种应用(这里就不展开解释了)
装饰器的最简单的一个理解就是,实现函数的附加功能,这个功能和函数本身的功能可以不相关
应用场景:
- 接口自动化时,发送请求因为网路等原因导致失败了
- 统计函数调用的耗时
- 日志记录
- 权限控制
- 缓存
- 数据校验
- ...
可以参考我的另一篇文章,装饰器鉴赏
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:李佳欣
@file: decorator.py
@time: 2022/11/15
装饰器的使用
"""
import time
## 一个最简单的装饰器
def secondFlood(func):
msg = "程序开始"
def thirdFlood():
print(msg)
func()
print("程序结束")
return thirdFlood
## 装饰器最好使用这种类型的
def secondFlood_1(func):
msg = "程序开始"
def thirdFlood(*arg,**kwargs):
print(msg)
func(*arg,**kwargs)
print("程序结束")
return thirdFlood
## 函数本身有返回值,需要使用return进行返回
def secondFlood_2(func):
msg = "程序开始"
def thirdFlood(*arg,**kwarg):
print(msg)
res = func(*arg,**kwarg)
print("程序结束")
return res
return thirdFlood
## 带参数的装饰器,相当于一个三层的嵌套
def timer(parameter):
def outer_wrapper(func):
def wrapper(*args, **kwargs):
res = None
if parameter == 'task1':
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print("the task1 run time is :", stop - start)
elif parameter == 'task2':
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print("the task2 run time is :", stop - start)
return res
return wrapper
return outer_wrapper
@secondFlood_2
def test(a,b):
print("test")
return a+b
@timer(parameter="task1")
def test_1(a,b):
print("test")
time.sleep(1)
return a+b
if __name__ == '__main__':
res = test(1,2)
print(res)
res = test_1(1,3)
print(res)