装饰器函数在Python中的实现
发布时间:2023-08-20 14:47:48
装饰器是Python中一种有用的编程模式,它能够扩展已有函数的功能,而又不需要修改其原代码。在Python中,装饰器是一个可调用对象,它接受一个函数作为输入,并返回另一个函数作为输出。
装饰器通常用于添加额外的功能,例如日志记录、输入检查、性能分析等。它能够在不修改函数代码的情况下,对函数进行动态的修改和扩展。下面是装饰器函数在Python中的实现方式:
1. 使用函数定义装饰器:装饰器实际上是一个普通的Python函数,它接受一个函数作为输入,并返回另一个函数作为输出。以下是一个简单的装饰器例子,用于在函数调用前后打印日志:
def logger(func):
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} executed")
return result
return wrapper
@logger
def add(a, b):
return a + b
print(add(1, 2)) # 输出:Calling function add,3,Function add executed
2. 使用类定义装饰器:除了使用函数定义装饰器外,还可以使用类定义装饰器。类装饰器需要实现 __call__ 方法,并接受一个函数作为输入。以下是一个类装饰器的例子,用于计算函数的执行时间:
import time
class Timer:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start_time = time.time()
result = self.func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"Function {self.func.__name__} executed in {execution_time} seconds")
return result
@Timer
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n-1)
print(factorial(5)) # 输出:Function factorial executed in 1.811981201171875e-06 seconds,120
3. 装饰器链:装饰器可以链式调用,即一个装饰器的输出可以作为另一个装饰器的输入。以下是一个使用了两个装饰器的例子,用于输入检查和类型转换:
def input_check(func):
def wrapper(*args, **kwargs):
if not all(isinstance(arg, (int, float)) for arg in args):
raise TypeError("Input arguments must be numeric")
return func(*args, **kwargs)
return wrapper
def type_conversion(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if isinstance(result, int):
return float(result)
elif isinstance(result, float):
return int(result)
else:
return result
return wrapper
@input_check
@type_conversion
def divide(a, b):
return a / b
print(divide(5, 2)) # 输出:2.5
print(divide(5, 0)) # 输出:TypeError: Input arguments must be numeric
装饰器是Python中非常有用的编程技巧之一,它可以为函数添加额外的功能、提高代码的复用性和可读性。通过函数和类的方式,我们可以自由地定义各种各样的装饰器,来适应不同的需求。
