自定义Python装饰器函数实现代码重用
装饰器是Python语言中的一个重要的特性,它可以用来修改、增强或者替换函数或类的功能,可以大大提高代码重用性。我们可以通过定义装饰器函数来实现代码的重用。
自定义Python装饰器函数的基本模板如下:
def decorator(func):
def wrapper(*args, **kwargs):
# do something
return func(*args, **kwargs)
return wrapper
@decorator
def func():
pass
上面的代码中,decorator是自定义的装饰器函数,它使用了Python的闭包特性,实现了对被装饰函数的包裹,并且在被装饰函数执行之前或之后执行一些操作。wrapper函数是闭包函数,它可以访问到外部函数的变量和参数,并且可以传递任意参数和关键字参数到被包裹函数func中。
装饰器可以接受任意数量和类型的参数,包括函数和其他对象。我们可以使用这些参数来自定义装饰器的功能。下面是一些示例:
1. 带参数的装饰器
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for i in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def say_hello():
print("Hello")
say_hello() # 输出 Hello 三次
在这个例子中,我们定义了一个repeat装饰器函数,它接受一个整数参数n,用来指定要重复执行的次数。decorator函数是闭包函数,它接受被装饰的函数作为参数。wrapper函数是闭包函数,它在被包裹函数执行之前或之后执行一些操作。在say_hello函数上方使用@repeat(3)装饰器,这意味着我们将say_hello函数传递给repeat装饰器,并传递一个整数参数3。最终的输出是 Hello 三次。
2. 统计函数执行时间的装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("Elapsed time:", end - start)
return result
return wrapper
@timer
def my_func():
time.sleep(1)
my_func() # 输出 Elapsed time: 1.0006859302520752
在这个例子中,我们定义了一个timer装饰器函数,它用来统计被装饰函数的执行时间。在被装饰的函数my_func上方使用@timer装饰器,这意味着我们将my_func函数传递给timer装饰器,并在执行my_func函数后输出执行时间。
3. 缓存装饰器
def cache(func):
cached = {}
def wrapper(*args):
if args in cached:
return cached[args]
result = func(*args)
cached[args] = result
return result
return wrapper
@cache
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # 输出 120
print(factorial(6)) # 输出 720
print(factorial(5)) # 输出 120,从缓存中获取
在这个例子中,我们定义了一个cache装饰器函数,它用来缓存被装饰函数的结果。在被装饰的函数factorial上方使用@cache装饰器,这意味着我们将factorial函数传递给cache装饰器,并用缓存来加速函数的执行。
Python装饰器函数可以帮助我们实现代码的重用,可以处理很多复杂的问题,如缓存、日志记录、参数检查等等。通过自定义装饰器函数,我们可以大大提高代码的重用性和可维护性,减少代码的重复和冗余。
