装饰器是Python中一种常见的语法糖,可以通过给函数或者类添加装饰器,来实现对原有功能的增强而不改变其结构。装饰器可以理解为一个函数,它的作用是接收一个函数作为参数,并返回一个新的函数。举个例子,下面这个装饰器的作用是在函数执行前后输出日志:
def log(func):
def wrapper(*args, **kwargs):
print('Before calling %s'%func.__name__)
result = func(*args, **kwargs)
print('After calling %s'%func.__name__)
return result
return wrapper
使用装饰器可以通过在函数定义的上一行添加@log来实现:
@log
def foo():
print('Hello, world!')
在调用foo函数时,会输出如下的日志:
Before calling foo
Hello, world!
After calling foo
需要注意的是,在使用装饰器时,需要保证装饰器和被装饰对象的签名一致,否则会出现类型不匹配的错误。同时,如果多次调用同一个装饰器来装饰同一个对象,会出现共享状态的问题,可以使用functools库中的wraps函数来解决。