python 装饰器
描述
python 中一切皆对象,函数也可以当作参数传递
装饰器就是接受一个函数作为参数,添加功能后返回一个新函数的函数或类。
python 中使用 @ 来使用装饰器。(@ 只是装饰器的语法糖,可以等价替代为其他)
装饰器经常用到的功能就是在代码中添加 log 日志。
实例
下面简单编写一个记录函数耗时的装饰器。
使用函数编写一个装饰器
import time
def log_time(func): # 接受一个函数作为参数
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
print('use time:{}'.format(time.time() - beg))
return res
return _log
@log_time # 装饰器语法糖
def mysleep():
time.sleep(1)
mysleep()
""" @log_time 等价于:
newsleep = log_time(mysleep)
newsleep()
"""
使用类编写一个装饰器
import time
class Logtime:
def __call__(self, func): #魔术方法
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
print('use time: {}'.format(time.time() - beg))
return res
return _log
@Logtime() # 注意这里和函数装饰器的区别
def mysleep2():
time.sleep(1)
mysleep2()
问题:如何给装饰器增加参数
答: 使用类装饰器我们可以比较方便实现装饰器参数 -- 通过定义
__init__
添加参数。
以上面的代码为例,给装饰器添加一个参数
import time
class Logtime:
def __init__(self, use_int = False): # 定义默认参数
self.use_int = use_int
def __call__(self, func): #魔术方法
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
if self.use_int:
print('use time: {}'.format(int(time.time() - beg)))
else:
print('use time: {}'.format(time.time() - beg))
return res
return _log
@Logtime(True) # 装饰器参数
def mysleep2():
time.sleep(1)
mysleep2()