python元编程之装饰器

2779 篇文章 4 订阅
2619 篇文章 14 订阅

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)-CSDN博客文章浏览阅读2.2k次,点赞85次,收藏11次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块……https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.5502装饰器是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中非常强大和灵活的元编程工具,可以帮助我们修改、扩展和包装函数和类的行为,提高代码的可重用性和可维护性。

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

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】在这里插入图片描述
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值