📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
装饰器是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%免费】