装饰器:用于修改其他函数功能的对象,python里一切都是对象,顾装饰器可以是函数也可以是类(单个函数接收装饰器,通过类可以实现多个功能,再通过继承可以实现增强功能)。一般用于权限验证和日志记录模块。
函数装饰器:
import time
from functools import wraps
# 计算函数的执行时间
def use_time(f):
@wraps(f)
def inner():
start_time = time.time()
print(f.__name__ + '正在要执行')
f()
end_time = time.time()
print("{name}执行时间:{s}".format(name=f.__name__,s=end_time - start_time))
return inner
# 调用装饰器
@use_time
def pt():
time.sleep(1)
print("我执行中")
pt()
类装饰器:
import time
from functools import wraps
class Func_Log:
def __init__(self, filename='out.txt'):
self.startime = time.time()
self.endtime = None
self.filename = filename
self.str = None
# 重写call函数,实现类作为装饰器的关键所在
def __call__(self, func):
@wraps(func)
def use_time():
self.str = "{name}正要执行:".format(name=func.__name__)
self.startime = time.time()
func()
self.endtime = time.time()
self.new_func()
self.sen_mail()
return use_time
def new_func(self):
print('可添加新的功能')
with open(self.filename, 'a') as log:
log.write(self.str + '\n')
log.write('本次日志记录完毕')
print('已经添加新的功能')
def sen_mail(self):
pass
class Func_log_pro(Func_Log):
def __init__(self, mail, *args, **kwargs):
self.mail = mail
super(Func_log_pro, self).__init__(*args, **kwargs)
def sen_mail(self):
print("发送一封邮件,邮件地址是:{mail}".format(mail=self.mail))
# @Func_Tmie('mylog.txt')
@ Func_log_pro('wqd@163.com','mylog.txt')
def pt():
time.sleep(1)
print('我要打印')
if __name__ == '__main__':
pt()