python元编程之装饰器

发布时间:2024年01月10日

装饰器是Python中一种强大的元编程工具,它可以用于修改、扩展或包装函数和类的行为。装饰器本质上是一个函数或类,它接受一个函数或类作为输入,并返回一个新的函数或类。在函数或类定义之前,使用`@装饰器名`的语法将装饰器应用于目标函数或类。

下面我们将深入探讨装饰器的实现原理,并列举10个实用的场景代码,包括带参数的装饰器、类装饰器和装饰器链式调用。

装饰器的实现原理:

装饰器实际上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。装饰器可以在不修改原始函数代码的情况下,通过包装器函数来修改函数的行为。装饰器的一般实现模式如下:

def decorator(func):
def wrapper(*args, **kwargs):
# 在调用原始函数之前的操作
        ...
        result = func(*args, **kwargs)  # 调用原始函数
# 在调用原始函数之后的操作
        ...
return result
return wrapper

在上面的示例中,`decorator`是一个装饰器函数,它接受一个函数`func`作为参数,并返回一个新的函数`wrapper`。`wrapper`函数用于包装原始函数`func`,在调用`func`之前和之后可以执行一些额外的操作。

装饰器场景代码:

1. 计时器装饰器:

? ?使用装饰器计算函数的执行时间。

import time
 
def timer(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
 
@timer
def my_function():
    # 执行某些操作
    ...

2. 调试器装饰器:

? ?使用装饰器打印函数的输入和输出,用于调试。

def debugger(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数 {func.__name__},输入:{args},{kwargs}")
        result = func(*args, **kwargs)
        print(f"函数 {func.__name__} 的输出:{result}")
        return result
    return wrapper
 
@debugger
def my_function(x, y):
    # 执行某些操作
    return result

3. 带参数的装饰器:

? ?实现带参数的装饰器,用于自定义装饰器的行为。

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator
 
@repeat(3)
def my_function():
    # 执行某些操作
    ...

4. 类装饰器:

? ?使用类装饰器来装饰函数或类。

class Decorator:
    def __init__(self, func):
        self.func = func
 
    def __call__(self, *args, **kwargs):
        # 在调用原始函数之前的操作
        ...
        result = self.func(*args, **kwargs)  # 调用原始函数
        # 在调用原始函数之后的操作
        ...
        return result
 
@Decorator
def my_function():
    # 执行某些操作
    ...

5. 缓存装饰器:

? ?使用装饰器缓存函数的计算结果,避免重复计算。

 
def cache(func):
    cached_results = {}
 
    def wrapper(*args, **kwargs):
        key = (args, tuple(sorted(kwargs.items())))
        if key not in cached_results:
            cached_results[key] = func(*args, **kwargs)
        return cached_results[key]
    return wrapper
 
@cache
def my_function(x, y):
    # 执行某些操作
    return result

6. 权限检查装饰器:

? ?使用装饰器检查用户的权限,控制函数的访问权限。

 
def check_permission(func):
    def wrapper(*args, **kwargs):
        if check_user_permission():
            return func(*args, **kwargs)
        else:
            raise PermissionError("用户没有访问权限")
    return wrapper
 
@check_permission
def my_function():
    # 执行某些操作
    ...

7. 日志记录装饰器:

? ?使用装饰器记录函数的调用日志。

def log(func):
    def wrapper(*args, **kwargs):
        logging.info(f"调用函数 {func.__name__},输入:{args},{kwargs}")
        result = func(*args, **kwargs)
        logging.info(f"函数 {func.__name__} 的输出:{result}")
        return result
    return wrapper
 
@log
def my_function():
    # 执行某些操作
    ...

8. 异常处理装饰器:

? ?使用装饰器捕获和处理函数中的异常。

def handle_exception(func):
    def wrapper(*args, **kwargs):
        try:
            result = func(*args, **kwargs)
        except Exception as e:
            # 处理异常
            ...
        return result
    return wrapper
 
@handle_exception
def my_function():
    # 执行某些操作
    ...

9. 身份验证装饰器:

? ?使用装饰器验证用户的身份信息。

def authenticate(func):
    def wrapper(*args, **kwargs):
        if authenticate_user():
            return func(*args, **kwargs)
        else:
            raise AuthenticationError("用户身份验证失败")
    return wrapper
 
@authenticate
def my_function():
    # 执行某些操作
    ...

10. 装饰器链式调用:

? ? 将多个装饰器链式应用于函数或类。

@decorator1
@decorator2
@decorator3
def my_function():
    # 执行某些操作
    ...

装饰器是Python中非常强大和灵活的元编程工具,可以帮助我们修改、扩展和包装函数和类的行为,提高代码的可重用性和可维护性。

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

文章来源:https://blog.csdn.net/shihuaizxc/article/details/135507460
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。