Python中装饰器函数的使用及示例
一、定义
装饰器(decorator)是Python语言中一种很常用的语法。可以动态地给一个对象添加一些额外的功能,但不改变它的结构。
装饰器本质上是一个函数,它可以使其他函数在不需要修改源代码的情况下添加一些附加功能,并且可以用于修改或增强函数的功能。
装饰器也可以作为组件来使用。因此,装饰器函数应该接受一个函数对象作为参数,然后返回一个包装后的函数对象。
二、使用
在Python中,装饰器函数是很灵活的,它可以被设计用来在函数定义时自动地对函数进行处理。
装饰器函数可以充当函数的“包装器”,可以添加到现有的函数的调用链中,从而增强函数的性能、功能或中间件。它的主要目标是避免代码重复,并使方法更简单。
三、示例
下面我们来看一个例子,来看看装饰器函数的使用。
示例1:实现一个简单的装饰器
实现一个装饰器,可以在函数执行前后输出"start"和"end"。代码如下:
def deco(func):
def wrapper():
print("start")
func()
print("end")
return wrapper
@deco
def test():
print("test")
test()
运行结果如下:
start test end
这个装饰器作为一个函数来定义,它接受一个函数作为参数(func),并返回一个包装后的函数(wrapper)。
在实际使用时,使用@deco装饰器来调用test函数,相当于test = deco(test),这样就会在执行test函数前后自动调用deco函数,并输出"start"和"end"。
示例2:实现一个带参装饰器
实现一个带有参数的装饰器,可以根据不同参数实现不同修改。代码如下:
def deco(arg):
def _deco(func):
def wrapper(*args, **kwargs):
print("before %s with arg %s" % (func.__name__, arg))
func(*args, **kwargs)
print("after %s with arg %s" % (func.__name__, arg))
return wrapper
return _deco
@deco("decorator")
def func(num1, num2):
print(num1 + num2)
func(2, 4)
运行结果如下:
before func with arg decorator 6 after func with arg decorator
这个装饰器是一个带有参数的函数,它接受一个参数arg,这个函数返回一个不带参数的函数_deco,并把参数传递给wrapper函数。
wrapper函数用*args和**kwargs来获取任意数量和任意类型的参数,并且在输出前后输出日志。
在实际使用时,@deco("decorator")静态调用deco函数,把参数传递给它,并返回_deco函数,然后_decor函数传递给它的函数参数func,并返回wrapper函数。最后,执行wrapper函数。
