作者:cxsw01 | 来源:互联网 | 2023-09-17 15:25
在开发Python程序的时候经常会看到 函数定义的第一行上面有一行类似 @aaaa 这样的文本,这是Python的装饰器,Python的装饰器英文名为Decorator,是一种特殊形式的函数。通过装饰器,我们可以给函数重用很多共通的功能函数,装饰器的语法糖符号是 @ 。
装饰器一共有三种内置装饰器,类装饰器、函数装饰器、带参数的函数装饰器,今天我们主要简单说明下装饰器的用途和基本使用方法。
一:简要装饰器
通过一个简单的例子,我们看一看装饰器的用法。
@my_decorator
def my_func(stuff):
do_things()
上面这个例子中,@my_decrator这个装饰器被加在了函数my_func上。这段代码相当于是把my_func当作参数传入my_decorator中,如下:
def my_func(stuff):
do_things()
my_func = my_decorator(my_func)
二:实际例子
下面我们通过一个实际的例子来了解其用途,我们想对一个函数插入一段执行时间日志。
1.首先定义装饰器 log
import time
def log(func):
def wrapper(*args,**kw):
print("call %s()" % func.__name__)
print("excute time is:" + time.strftime("%Y-%m-%d %H:%M:%S"),time.localtime())
return func(*args,**kw)
return wrapper
2.使用装饰器
@log
def excute(name):
print('excute '+name)
excute('start')
3.执行结果
call excute()
excute time is:2019-06-23 23:09:12 time.struct_time(tm_year=2019, tm_mon=6, tm_mday=23, tm_hour=23, tm_min=9, tm_sec=12, tm_wday=6, tm_yday=174, tm_isdst=0)
excute start
我们从上面的例子中可以看出excute函数的逻辑代码并没有被改变,而是在函数之外实现了日志的功能,这样我们的代码的耦合性就会降低。
总结
以上只是对装饰器用法的简单介绍,装饰器需要自己多做一些实验来做验证,在Flask的框架中使用装饰器的时间特别多,大家可以看看Flask对装饰器的处理。
我平时在使用装饰器主要会在以下情景中使用到,大家可以参考一下:
1.注入参数,提供默认的参数或者生成新的格式的参数
2.记录函数的行为(日志、缓存、定时等)
3.预处理(登陆验证等上下文环境的环境处理)