装饰器原来这么重要

什么是装饰器?

装饰器是 Python 中的一个重要概念,它可以在不修改被装饰函数的源代码的情况下,为函数添加额外的功能。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数。新的函数在执行时会先执行装饰器函数中的代码,然后再执行被装饰函数的代码。
 
例:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("函数执行前")
        result = func(*args, **kwargs)
        print("函数执行后")
        return result
    return wrapper

# 定义一个被装饰的函数
@my_decorator
def my_function(x, y):
    return x + y

# 调用被装饰的函数
result = my_function(1, 2)
print("结果:", result)


解析:


 定义一个名为 my_decorator 的装饰器函数,它接收一个函数作为参数,并返回一个新的函数 wrapper 。

在 wrapper 函数中,首先打印一条消息"函数执行前",然后调用被装饰的函数 func ,并将结果存储在变量 result 中。

最后,打印一条消息"函数执行后",并返回结果 result 。
 
使用 @my_decorator 装饰器来装饰一个名为 my_function 的函数。

当调用 my_function 函数时,实际上是在调用 wrapper 函数, wrapper 函数会先执行装饰器函数中的代码,然后再执行被装饰函数 my_function 的代码。

在实际应用中使用装饰器来提高代码可读性和可维护性的方法:


 
1. 功能分离:将特定的、独立的功能提取到装饰器中,使主函数代码更专注于核心业务逻辑,让代码结构更清晰。

def print_info_decorator(func):
    def wrapper(*args, **kwargs):
        print("开始执行函数")
        func(*args, **kwargs)
        print("函数执行完毕")
    return wrapper

@print_info_decorator
def do_something():
    print("正在做某事")

do_something()


2. 权限控制:通过装饰器来实现对某些函数的访问权限检查,使得权限管理逻辑集中且易于理解和修改。

def has_permission(permission_level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if user_has_permission(permission_level):  # 模拟权限检查
                func(*args, **kwargs)
            else:
                print("无权执行")
        return wrapper
    return decorator

@has_permission("admin")
def admin_task():
    print("执行管理员任务")

# 假设用户没有相应权限
admin_task()


3. 日志记录:利用装饰器方便地添加日志记录功能,而无需在每个函数中重复编写相关代码。

import time

def log_execution_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行时间: {end_time - start_time} 秒")
        return result
    return wrapper

@log_execution_time
def long_running_task():
    time.sleep(2)

long_running_task()


4. 性能监控:可以用装饰器来记录函数的执行时间等性能相关信息,便于对系统性能进行分析和优化。

def monitor_performance(func):
    def wrapper(*args, **kwargs):
        # 可以在这里添加更详细的性能统计代码
        func(*args, **kwargs)
    return wrapper

@monitor_performance
def complex_calculation():
    # 一些复杂计算
    pass


5. 状态检查:比如在特定场景下对函数执行前的一些必要状态进行检查和处理,增强代码的健壮性。

def check_status(func):
    def wrapper(*args, **kwargs):
        if system_is_ready():  # 假设的系统状态检查
            func(*args, **kwargs)
        else:
            print("系统未准备好")
    return wrapper

@check_status
def start_operation():
    print("开始操作")

start_operation()


6. 统一接口包装:对一组类似功能的函数进行统一的装饰,提供一致的行为和外观,提高代码的规范性和可识别性。

def standardize_api(func):
    def wrapper(*args, **kwargs):
        # 统一处理输入和输出格式等
        result = func(*args, **kwargs)
        return standardized_result(result)  # 假设的标准化处理
    return wrapper

@standardize_api
def api_function1():
    return "原始结果 1"

@standardize_api
def api_function2():
    return "原始结果 2"


7. 参数验证:在装饰器中进行参数的合法性检查,确保函数运行在正确的条件下。

def validate_args(func):
    def wrapper(*args, **kwargs):
        if validate_parameters(*args, **kwargs):  # 假设的参数验证函数
            func(*args, **kwargs)
        else:
            print("参数不合法")
    return wrapper

@validate_args
def process_data(data):
    print(f"处理数据: {data}")

process_data("invalid_data")


 假设有一系列需要进行权限检查的函数,通过一个权限装饰器来统一处理,就避免了在每个函数中重复编写权限代码,同时也使权限逻辑的修改只需要在装饰器中进行,维护起来更加方便。而且,其他人在阅读代码时,也能快速理解这些函数具有特定的权限要求。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值