Python中的装饰器函数用法及常见示例
装饰器是Python中常用的一种语法结构,它可以在不改变原函数代码的前提下,对函数进行扩展、修改或包装等操作。这种语法结构极大地方便了Python程序员的开发工作。下面将对Python中装饰器的用法及常见示例进行介绍。
1. 装饰器的基本语法
Python中装饰器的基本语法如下:
def decorator_func(func):
def wrapper(*args, **kwargs):
# do something before calling the original function
result = func(*args, **kwargs)
# do something after calling the original function
return result
return wrapper
@decorator_func
def original_func(*args, **kwargs):
# do something
return result
在这个示例中,装饰器函数decorator_func接受一个函数作为参数,并返回一个新的函数wrapper,wrapper函数包装了原函数original_func,在调用original_func之前和之后可以进行一些操作。使用@decorator_fucn语法糖可以简化函数装饰器的调用方式,使代码更加简洁。
2. 装饰器的常见示例
下面介绍几种常见的装饰器示例。
2.1 计时器装饰器
计时器装饰器是常见的一种装饰器,它可以用来记录函数的执行时间。示例代码如下:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("Time used: {} seconds".format(end_time - start_time))
return result
return wrapper
@timer
def my_func(*args, **kwargs):
# do something
return result
使用time模块来计算函数执行时间,将计时器装饰器作为@语法糖来使用,将计时器装饰器加在my_func函数上,就可以实现计时功能。
2.2 缓存装饰器
缓存装饰器可以将函数的执行结果进行缓存,当函数再次调用时,如果输入参数相同,可以直接取出缓存结果,不必重新计算。示例代码如下:
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 my_func(*args):
# do something
return result
函数的执行结果被缓存在一个字典中,当输入参数相同时,可以直接从字典中取出结果,避免了重新计算的过程。
2.3 日志装饰器
日志装饰器可以用来记录函数的调用日志,以及参数和返回值等信息。示例代码如下:
def logger(func):
def wrapper(*args, **kwargs):
arg_str = ", ".join(repr(arg) for arg in args)
kwarg_str = ", ".join("{}={}".format(k, v) for k, v in kwargs.items())
signature = "{}({})".format(func.__name__, ", ".join([arg_str, kwarg_str]))
print("Starting {}".format(signature))
result = func(*args, **kwargs)
print("Finished {} with result {}".format(signature, result))
return result
return wrapper
@logger
def my_func(*args, **kwargs):
# do something
return result
使用repr函数将参数转换成字符串的形式,记录函数的调用日志,以及参数和返回值等信息。
3. 总结
装饰器是Python中非常重要的一种语法结构,它可以在不改变原函数代码的前提下,对函数进行扩展、修改或包装等操作,这种语法结构极大地方便了Python程序员的开发工作。本文介绍了装饰器的基本语法和常见示例,在实际开发中应该根据需要选择合适的装饰器进行使用。
