Python编程二十二:装饰器详解

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


装饰器是Python中一个非常强大的特性,它允许我们在不修改原函数的情况下,为函数动态添加额外的功能。今天,我们就来深入探讨Python中的装饰器,通过丰富的代码示例和应用场景,帮助你更好地理解和使用装饰器。

目录

装饰器的基本概念

简单装饰器的实现

带参数的装饰器

装饰器的实际应用场景

类装饰器

使用functools.wraps保留函数信息

总结‍

1. 装饰器的基本概念

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰器的作用是在不修改原函数的情况下,为函数添加额外的功能。

2. 简单装饰器的实现

示例1:基本装饰器

应用场景:

在函数执行前后添加日志。

def my_decorator(func):    
    def wrapper():        
        print("函数调用前执行")        
        func()  # 调用原函数        
        print("函数调用后执行")    
    return wrapper
@my_decorator
def say_hello():    
print("Hello, World!")
say_hello()

输出:

函数调用前执行

Hello, World!

函数调用后执行

解析:

my_decorator是一个装饰器,wrapper是内部函数,它在调用原函数前后添加了额外的逻辑。

3. 带参数的装饰器

示例2:支持参数的装饰器

应用场景:

装饰器需要支持带参数的函数。​​​​​​​

def my_decorator(func):    
    def wrapper(*args, **kwargs):        
        print("函数调用前执行")        
        result = func(*args, **kwargs)        
        print("函数调用后执行")        
        return result    
    return wrapper
@my_decorator
def greet(name):    
    print(f"Hello, {name}!")
greet("Alice")

输出:

函数调用前执行

Hello, Alice!

函数调用后执行

解析:

通过*args和**kwargs,装饰器可以支持任意类型的参数。

4. 装饰器的实际应用场景

示例3:记录函数执行时间

应用场景:

测量函数的执行时间。​​​​​​​

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:.4f} 秒")        
        return result    
    return wrapper
@timer
def slow_function():    
    time.sleep(2)    
    print("慢函数执行完成")
slow_function()

输出:

慢函数执行完成

函数 slow_function 执行耗时 2.0002 秒

解析:

装饰器timer通过time模块记录函数的执行时间。

示例4:日志记录

应用场景:

记录函数的调用信息。​​​​​​​

def log_decorator(func):    
    def wrapper(*args, **kwargs):        
        print(f"调用函数:{func.__name__},参数:{args} {kwargs}")        
        result = func(*args, **kwargs)        
        print(f"函数 {func.__name__} 执行完成,返回结果:{result}")        
        return result    
    return wrapper
    @log_decorator
def add(a, b):    
    return a + b
print(add(5, 3))

输出:

调用函数:add,参数:(5, 3) {}

函数 add 执行完成,返回结果:8

8 解析:

装饰器log_decorator记录了函数的名称、参数和返回值。

示例5:权限验证

应用场景:

在函数执行前验证用户权限。​​​​​​​

def login_required(func):    
    def wrapper(*args, **kwargs):        
        if not is_logged_in():            
            print("请先登录")            
            return None        
        return func(*args, **kwargs)    
    return wrapper
@login_required
def sensitive_operation():    
    print("执行敏感操作")
def is_logged_in():    
    return False  # 模拟用户未登录
sensitive_operation()

输出:

请先登录

解析:

装饰器login_required在函数执行前验证用户是否登录。

示例6:重复执行函数

应用场景:

多次执行函数。​​​​​​​

def repeat(n):    
    def decorator(func):        
        def wrapper(*args, **kwargs):            
            for _ in range(n):                
                func(*args, **kwargs)        
        return wrapper    
    return decorator
@repeat(3)
def say_hello():    
  print("Hello!")
say_hello()

输出:

Hello!

Hello!

Hello!

解析:

装饰器repeat通过嵌套函数实现了多次执行。

5. 类装饰器

示例7:类装饰器

应用场景:

使用类实现装饰器。​​​​​​​

class CountCalls:    
    def __init__(self, func):        
        self.func = func        
        self.num_calls = 0    
    def __call__(self, *args, **kwargs):        
        self.num_calls += 1        
        print(f"第 {self.num_calls} 次调用 {self.func.__name__}")        
        return self.func(*args, **kwargs)
@CountCalls
def test_function():    
    print("执行测试函数")
test_function()
test_function()

输出:

第 1 次调用 test_function

执行测试函数

第 2 次调用 test_function

执行测试函数

解析:

类装饰器通过__call__方法实现对函数的装饰。

6. 使用functools.wraps保留函数信息

示例8:保留函数信息

应用场景:

避免装饰器覆盖原函数的名称和文档。​​​​​​​

import functools
def my_decorator(func):    
    @functools.wraps(func)    
    def wrapper(*args, **kwargs):        
        print("函数调用前执行")        
        return func(*args, **kwargs)    
    return wrapper
@my_decorator
def example_function():    
"""这是一个示例函数"""    
    print("执行示例函数")
print(example_function.__name__)  # 输出:example_function
print(example_function.__doc__)   # 输出:这是一个示例函数

解析:

functools.wraps用于保留原函数的名称和文档。

7. 总结

装饰器是Python中一个非常实用的特性,它可以在不修改原函数的情况下,动态地为函数添加额外的功能。通过本文的介绍,相信你对装饰器有了更深入的理解。装饰器不仅可以用于日志记录、性能监控和权限验证,还可以通过类实现更复杂的逻辑。

希望这篇文章能帮助你更好地掌握Python中的装饰器。如果你对装饰器还有其他疑问,或者有更多想要了解的内容,欢迎在评论区留言交流!

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
在这里插入图片描述​​
在这里插入图片描述​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值