3分钟带你了解Python装饰器(Decorators)离成为大佬又近了一步

装饰器(Decorators)是Python中一种强大的编程工具,它允许您在不修改被装饰函数源代码的情况下,增加、修改或扩展函数的功能。装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数。装饰器在实际开发中常用于代码重用、日志记录、性能分析、权限检查等方面。

下面是一个装饰器的基本结构

Python 复制代码
def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 添加装饰逻辑
        result = original_function(*args, **kwargs)
        # 返回被装饰函数的结果
        return result
    return wrapper_function

接下来我会举三个🌰🌰🌰来进一步带你们了解Python装饰器的用法,相信会对你们有所帮助👏👏👏(此处应该有掌声)

第一个🌰:

计时装饰器

这个装饰器可以用来计算函数的执行时间,比如在对一些函数做性能分析时,往往需要统计执行时间,有了装饰器我们就不需要写重复代码了,只需要给需要计算执行时间的方法加上装饰器即可。

Python 复制代码
# 这个装饰器可以用来计算函数的执行时间。
import time

# 这里是装饰器的定义
def timing_decorator(original_function):
    def wrapper_function(*args, **kwargs):
        start_time = time.time()
        result = original_function(*args, **kwargs)
        end_time = time.time()
        print(f"函数{original_function.__name__}执行使用了{end_time - start_time}秒")
        return result
    return wrapper_function

# @后面跟着的方法就是我们定义的装饰器了
@timing_decorator
def slow_function():
    time.sleep(2)

#这里调用了slow_function(),会输出方法所用时间
slow_function()

运行结果如下:

第二个🌰:

权限检验装饰器

这个装饰器可以用来检查用户是否有足够的权限执行某个操作。示例装饰器有1个入参,输入的是用户角色,比如只有角色是admin和root的才有对方法do_something()有操作的权限。

Python 复制代码
# 这个装饰器可以用来检查用户是否有足够的权限执行某个操作。

def permission_required(permission):
    def decorator(original_function):
        def wrapper_function(*args, **kwargs):
            if has_permission(permission):
                return original_function(*args, **kwargs)
            else:
                # 装饰器内部使用了 raise 关键字来抛出异常,以便在特定条件下阻止函数继续执行。
                raise PermissionError("没有操作权限") 
        return wrapper_function
    return decorator

def has_permission(user_role):
    user_roles = ['admin','root']
    if user_role in user_roles:
        return True
    else:
        return False
    
@permission_required("admin111")
def do_something(resource_id):
    # 有权限操作
    print(f"您有操作【{resource_id}】 的权限")

do_something('查看用户交易记录')

运行结果如下: 当@permission_required("admin111")的入参是admin111时输出结果如下:

@permission_required("admin")的入参是admin时输出结果如下:

第三个🌰:

日志装饰器

这个装饰器可以用来记录函数的调用和参数。

Python 复制代码
# 这个装饰器可以用来记录函数的调用和参数。
def log_arguments(original_function):
    def wrapper_function(*args, **kwargs):
        print(f"调用了:{original_function.__name__}方法,传入的args为: {args}传入的kwargs为: {kwargs}")
        result = original_function(*args, **kwargs)
        return result
    return wrapper_function

@log_arguments
def add(a, b):
    return a + b

result = add(3, 5)

运行结果如下:


备注

raise 是Python中用于引发异常的关键字。当您在代码中使用 raise 关键字时,您实际上是在抛出一个异常,从而指示程序出现了错误或异常情况。

在上述示例中,装饰器内部使用了 raise 关键字来抛出异常,以便在特定条件下阻止函数继续执行。

相关推荐
泡干脆面就番茄7 小时前
深度学习:PyTorch框架初识——MNIST手写数字识别
python·深度学习
shirsl7 小时前
算法 Day 5 树 / 二叉树 + DFS
数据结构·python·算法
门思科技7 小时前
开源网关有哪些:主流类型梳理
网络·python·物联网
szephyr7 小时前
Python 爬虫合规与反爬实战:从 requests 到 Playwright
爬虫·python·requests·playwright·反爬
E-iceblue8 小时前
Excel 列转行/行列转换全指南:从 4 种常见解法到 Python 批量自动化
python·excel·python库·spire.xls
言乐68 小时前
Python + NumPy 从零实现的 BP 神经网络(反向传播)脚本模型,包含前向传播、反向传播、训练和预测,并用 XOR 数据做示例
python·django·virtualenv·pygame·tornado
Ticnix9 小时前
多租户 RAG:让每个用户只检索到自己的知识库
后端·python·agent
ID34610744209 小时前
【课程设计】基于Spring Boot+Vue的游戏账号租赁系统的设计与实现-计算机毕设 附源码50345
javascript·vue.js·spring boot·python·node.js·php·课程设计
夏雪coding9 小时前
RAG 要不要上向量库:720 个 chunk 用 numpy 点积就够了
python·aigc·ai编程
Ticnix9 小时前
我删了 200 行 if-else,把决策逻辑全写进了 System Prompt
python·llm·agent