Python中的装饰器函数使用详解及示例
装饰器(Decorator)是 Python 中非常重要的一个概念,它可以用来改变或扩展现有函数的行为,而又不需要修改函数的源代码。本文将介绍 Python 中装饰器的使用方法及示例。
一、装饰器的定义和基本用法
装饰器本质上是一个函数,它的作用是可以对其他函数进行包装和修饰,并返回一个新的函数,以改变原有函数的行为。装饰器的语法结构如下所示:
def decorator(func):
def wrapper(*args, **kwargs):
print("Decorator Start")
result = func(*args, **kwargs)
print("Decorator End")
return result
return wrapper
其中,decorator 就是装饰器函数,它的参数是一个函数 func,它的返回值是一个新的函数 wrapper。wrapper 函数中包含了一些额外的代码,这些代码会在原有函数 func 的执行前后执行,并对原有函数的返回结果进行处理。
装饰器的基本用法是将装饰器函数和需要被装饰的函数一起传入装饰器函数,例:
@decorator
def my_function(*args, **kwargs):
# 原有的函数代码逻辑
pass
在这个例子中,my_function 就是需要被装饰的函数,@decorator 则是装饰器函数。这条语句代码的执行结果是,将 my_function 函数传入 decorator 函数中,并返回一个新的函数,然后将新的函数赋值给 my_function 变量。
二、使用场景及示例
装饰器可以为函数添加额外的功能,例如日志记录、异常处理、性能统计等等。下面我们分别来看几个例子。
1.日志记录
使用装饰器在函数执行前后添加日志记录的功能。例:
def log_decorator(func):
def wrapper(*args, **kwargs):
print("[INFO] [{0}] Function {1}() is called.".format(datetime.now(), func.__name__))
result = func(*args, **kwargs)
print("[INFO] [{0}] Function {1}() is finished.".format(datetime.now(), func.__name__))
return result
return wrapper
@log_decorator
def my_function():
pass
这个例子中,我们定义了一个 log_decorator 装饰器函数,它会在函数执行前后打印日志信息。然后将 my_function 函数传入 log_decorator 函数中,@log_decorator 表示将新的函数赋值给 my_function 变量。
2.异常处理
使用装饰器对函数进行异常处理,如果发生异常则记录日志并终止程序执行。例:
def exception_decorator(func):
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
except Exception as e:
print("[ERROR] [{0}] Function {1}() failed: {2}".format(datetime.now(), func.__name__, str(e)))
sys.exit(1)
return result
return wrapper
@exception_decorator
def my_function():
pass
这个例子中,我们定义了一个 exception_decorator 装饰器函数,它会在函数执行过程中进行异常处理,打印异常信息并终止程序执行。然后将 my_function 函数传入 exception_decorator 函数中,@exception_decorator 表示将新的函数赋值给 my_function 变量。
3.性能统计
使用装饰器对函数进行性能统计,包括函数执行的时间和内存占用情况。例:
def performance_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("[PERFORMANCE] Function {0}() takes {1:.6f} seconds to run.".format(func.__name__, end_time - start_time))
if memory_usage:
memory_usage_psutil = psutil.Process(os.getpid()).memory_info().rss / float(2 ** 20)
print("[PERFORMANCE] Function {0}() takes {1:.6f} MB to run.".format(func.__name__, memory_usage_psutil))
return result
return wrapper
@performance_decorator
def my_function():
pass
这个例子中,我们定义了一个 performance_decorator 装饰器函数,它会在函数执行时记录执行时间和内存占用情况。如果设置了 memory_usage 参数,则还会记录内存占用情况。然后将 my_function 函数传入 performance_decorator 函数中,@performance_decorator 表示将新的函数赋值给 my_function 变量。
总结
本文介绍了 Python 中装饰器的定义和基本用法,以及装饰器的常用场景和示例,包括日志记录、异常处理和性能统计等。装饰器是 Python 中非常有用的一种技术,它可以让我们更方便地扩展和修改函数的功能,并提高了程序的可维护性和可重用性。
