Python函数装饰器的用法介绍和实例讲解
Python函数装饰器是Python语言的一个重要特性,它可以在不改变原有函数代码的情况下,为函数添加额外的功能。函数装饰器是一种函数,它接受一个函数为参数,并返回一个新的函数。
函数装饰器具有以下特点:
1. 函数装饰器是一个高阶函数,接受一个函数作为参数,返回一个函数。
2. 函数装饰器可以用来装饰任意可调用对象,如函数、类、静态方法、类方法等。
3. 函数装饰器可以在源代码中的任何位置使用,因为它是在编译阶段执行的。
函数装饰器的基本用法如下所示:
def decorator_function(func):
def wrapper(*args, **kwargs):
# 执行一些额外的操作
result = func(*args, **kwargs)
# 执行一些额外的操作
return result
return wrapper
@decorator_function
def my_function():
# 函数代码
pass
在上述代码中,我们定义了一个名为decorator_function的装饰器函数。它接受一个函数func作为参数,并返回了一个新的函数wrapper。wrapper函数包装了原始的函数func,在执行原始函数之前和之后执行了一些额外的操作。
为了使用函数装饰器,我们使用@decorator_function的语法将装饰器应用到目标函数my_function上。这样,当我们调用my_function时,实际上是在调用wrapper函数。
函数装饰器可以用于许多不同的用途,下面是几个例子:
1. 日志记录
import logging
def log_decorator(func):
def wrapper(*args, **kwargs):
logging.info(f"Calling function {func.__name__}")
result = func(*args, **kwargs)
logging.info(f"Function {func.__name__} called successfully")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(2, 3))
在上述代码中,我们定义了一个名为log_decorator的装饰器函数,它用于记录函数的调用。当我们调用add函数时,log_decorator装饰器会在函数执行前输出一条日志,并在函数执行后输出另一条日志。
2. 计时器
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Elapsed time: {end_time - start_time} seconds")
return result
return wrapper
@timer_decorator
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))
在上述代码中,我们定义了一个名为timer_decorator的装饰器函数,用于计算函数的执行时间。当我们调用factorial函数时,timer_decorator装饰器会在函数执行前记录开始时间,并在函数执行后计算并打印函数的执行时间。
3. 权限验证
def check_permission_decorator(permission):
def decorator(func):
def wrapper(*args, **kwargs):
if permission == "admin":
print("Permission granted")
return func(*args, **kwargs)
else:
print("Permission denied")
return wrapper
return decorator
@check_permission_decorator(permission="admin")
def delete_file(filename):
print(f"Deleting file {filename}")
delete_file("test.txt")
在上述代码中,我们定义了一个名为check_permission_decorator的装饰器,用于检查用户权限。当我们调用delete_file函数时,check_permission_decorator(permission="admin")装饰器会首先检查用户权限,如果权限为"admin",则允许执行函数,否则拒绝执行。
总结:函数装饰器是一种强大而灵活的特性,它可以为函数增加额外的功能,如日志记录、计时器、权限验证等。通过函数装饰器,我们可以实现代码的重用和扩展,提高代码的可维护性和可测试性。
