python
装饰器
说明
《Python 教程》 帮助读者成为泛程序员,持续修订中,提供建议、纠错、催更加微信 gairuo123。查看 更新日志。作者开办 Python 数据分析培训,详情 Python 数据分析培训。
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
我们有时候写函数时,发现有些针对函数的功能是通用的,比如要把这个函数的执行时间显示出来,又如要想函数的 return
值优化一下显示出来。装饰器的作用就是为已经存在的对象添加额外的功能,这个功能可以应用在很多的函数上,就是函数的函数。
装饰器的强大之处就在于不修复原来函数的代码就可以实现对函数功能的扩展,典型的使用场景有权限校验、用户认证、事务处理、日志记录、性能测试、缓存等等,大大提高代码的复用性。
我们来看一个非常简单的装饰器例子。首先有一个输出参数的函数:
def foo(x):
print('foo out:', x)
# 调用函数
foo(123)
# foo out: 123
我们的需求是给这个函数执行时加上日志,开始执行和结束执行,下加写一个装饰器:
def log(func):
def decorator(*args, **kwargs):
print(f'开始执行: {func.__name__}')
func(*args, **kwargs)
print('执行结束')
return decorator
以上函数的逻辑是,定义了一个 log 函数,也就是装饰器的名字,它的参数是传入一个函数对象,log 内又定义了一个 decorator 函数,参数可以理解为接受函数 func 任意参数,在 decorator 内执行 func 函数,并在执行前后增加日志日志内容的输出。log 最终将 decorator 的执行结果返回。
我们重新给foo函数应用装饰器:
@log
def foo(x):
print('foo out:', x)
# 再次调用函数
foo('Hello world!')
'''
开始执行: foo
foo out: Hello world!
执行结束
'''
权限校验、用户认证、事务处理、日志记录、性能测试、缓存
todo
常见的内置装饰器有三种,@property、@staticmethod、@classmethod:
todo