通过Python Decorator进行函数的装饰和修改
Python Decorator是Python函数的一个特殊类型,它允许程序员可以在不修改函数本身的情况下,对函数进行功能的装饰和修改。通过Decorator,我们可以创建一个“包装器函数”(wrapper function),来对目标函数进行封装,以实现对目标函数的扩展或修改。
在Python中,Decorator本质上是一种“语法糖”,它是通过特殊的语法结构来实现的。一个Decorator可以被写成一个函数或者一个类,也可以是一个实现了__call__方法的任何对象。当Decorator应用到一个函数上时,它将返回一个带有包装器函数引用的对象,这个包装器函数将取代原始函数的引用。
Python Decorator的使用场景非常广泛,常见的Decorator有@classmethod、@staticmethod、@property、@lru_cache、@wraps等。下面我们将通过几个实例来感性理解Python Decorator的使用。
1. 对函数进行计时
下面的代码展示了如何使用Decorator来对函数进行计时,这个Decorator可以用来测量函数执行的时间:
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print('花费时间:', end - start)
return result
return wrapper
# 使用@timer装饰器
@timer
def add(a, b):
time.sleep(1)
return a+b
print(add(1, 2))
代码中,我们定义了一个timer函数,它接受一个func参数,这个参数指向待修饰的函数。在装饰器内部,我们定义了一个wrapper函数,这个函数用来计时并返回结果,在最后算出函数执行的耗时。最后,我们通过@timer就可以对add函数进行装饰。
2. 缓存计算结果
下面的代码展示了如何使用Decorator来缓存函数的计算结果,这个Decorator可以用来避免重复计算:
import functools
def memoize(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if wrapper.cache is None:
wrapper.cache = {}
key = (args, tuple(kwargs.items()))
if key not in wrapper.cache:
wrapper.cache[key] = func(*args, **kwargs)
return wrapper.cache[key]
wrapper.cache = None
return wrapper
# 使用@memoize装饰器
@memoize
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(5))
print(fib(5))
代码中,我们定义了一个memoize函数,它接受一个func参数,这个参数指向待修饰的函数。在memoize内部,我们定义了一个wrapper函数,它用来缓存函数的计算结果。我们通过@memoize就可以对函数进行装饰,从而避免重复计算。
3. 对函数进行日志输出
下面的代码展示了如何使用Decorator来对函数进行日志输出,这个Decorator可以用来记录函数执行的日志:
import logging
logging.basicConfig(filename='test.log', level=logging.INFO)
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logging.info('开始执行函数:%s', func.__name__)
result = func(*args, **kwargs)
logging.info('函数%s的执行结果为:%s', func.__name__, result)
return result
return wrapper
# 使用@log装饰器
@log
def add(a, b):
return a+b
print(add(1, 2))
代码中,我们定义了一个log函数,它接受一个func参数,这个参数指向待修饰的函数。在log内部,我们定义了一个wrapper函数,它用来记录函数执行的日志。我们通过@log就可以对函数进行装饰,从而记录函数的执行过程。
总结
Python Decorator是Python语言的一个独特特性,它为Python编程提供了一种非常灵活、通用、优雅的方式来扩展和修改函数功能。通过Decorator,我们可以使得函数代码更加简洁、易读、且易于复用和维护。在Python中,我们可以使用注解来为函数添加装饰器,从而快速地实现常见的功能。
