Python函数的装饰器及应用实例介绍
发布时间:2023-07-06 18:04:15
Python中的装饰器是一种特殊的函数,它可以在不修改被装饰函数代码的情况下,动态地修改函数的行为。装饰器的使用可以简化代码,增加可读性,提高代码的复用性。
装饰器的定义使用了@符号,将装饰器函数放在被装饰函数的定义之前,并将被装饰函数作为参数传递给装饰器函数。装饰器函数对被装饰函数进行一些操作,然后返回修改后的函数或函数对象。
装饰器的应用非常广泛,可以用于实现函数的日志记录、权限检查、性能测试等功能。
下面通过几个案例介绍装饰器的使用。
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_func():
time.sleep(1)
my_func()
这个例子中,timer装饰器函数接收一个函数作为参数,并在该函数执行前后记录时间。装饰器函数中定义了一个内部函数wrapper,用于真正执行被装饰的函数。最后,将装饰器应用于my_func函数,当my_func函数被调用时,会自动记录执行时间。
2. 日志记录装饰器
def logger(func):
def wrapper(*args, **kwargs):
print(f"调用了{func.__name__}函数,参数:{args, kwargs}")
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
add(1, 2)
这个例子中,logger装饰器函数接收一个函数作为参数,并在该函数执行前打印日志信息。装饰器函数中定义了一个内部函数wrapper,用于真正执行被装饰的函数。最后,将装饰器应用于add函数,当add函数被调用时,会自动打印日志信息。
3. 权限验证装饰器
def check_permission(func):
def wrapper(user):
if user == "admin":
return func(user)
else:
raise ValueError("没有访问权限")
return wrapper
@check_permission
def show_data(user):
# 展示数据的逻辑
pass
show_data("admin")
这个例子中,check_permission装饰器函数接收一个函数作为参数,并在该函数执行前进行权限验证。装饰器函数中定义了一个内部函数wrapper,用于真正执行被装饰的函数。最后,将装饰器应用于show_data函数,当show_data函数被调用时,会自动进行权限验证。
通过这些例子,可以看到装饰器的使用可以简化代码,提高代码的复用性。在实际开发中,可以根据需求定义适合的装饰器,方便地对函数进行功能扩展和定制。
