Python装饰器函数:让你的函数更加优雅
发布时间:2023-07-04 22:03:04
Python装饰器是一种可以在不修改原函数代码的情况下,给函数增加额外功能的方法。装饰器函数接受一个函数作为输入,返回一个新的函数作为输出,这个新的函数包含了原函数的功能,并且增加了一些额外的处理。
装饰器函数可以实现很多有用的功能,比如日志记录、性能分析、缓存等。它们可以让代码更加优雅、可读性更高,同时也可以提高代码的复用性和可维护性。
下面我们来看一个简单的装饰器函数的例子:
def log_func(func):
def wrapper(*args, **kwargs):
print(f'Calling function {func.__name__}')
result = func(*args, **kwargs)
print(f'Function {func.__name__} finished')
return result
return wrapper
@log_func
def add(a, b):
return a + b
result = add(1, 2)
print(result)
在上面的例子中,我们定义了一个装饰器函数log_func,它接受一个函数func作为输入。装饰器函数内部定义了一个新的函数wrapper,它接受任意数量的位置参数和关键字参数,并且在调用原函数之前打印一条日志,在调用原函数之后再打印一条日志。最后,装饰器函数返回这个新的函数wrapper。
在使用这个装饰器函数的时候,我们使用@log_func的语法将它应用到原函数add上。这样我们就得到了一个新的函数add,它具有了原函数的功能,同时还增加了日志打印的额外功能。我们可以像调用原函数一样调用这个新的函数,并且会看到相应的日志输出。
装饰器函数的用法非常灵活,可以根据需求来定义不同功能的装饰器。下面是一些常见的装饰器的例子:
- 计时器装饰器:用于计算函数的运行时间。
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__} took {end_time - start_time} seconds to run')
return result
return wrapper
@timer
def long_running_task():
time.sleep(5)
long_running_task()
- 状态缓存装饰器:用于缓存函数的结果,避免重复计算。
def memoize(func):
cache = {}
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key in cache:
return cache[key]
result = func(*args, **kwargs)
cache[key] = result
return result
return wrapper
@memoize
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
以上只是装饰器的一些基本用法示例,实际中可以根据具体需求来组合和定制装饰器函数,以实现更加灵活和强大的功能。装饰器函数的设计思想可以很好地体现Python的函数式编程特性,给我们的代码带来了很多便利和优雅。
