工作过程中使用到装饰器完成业务功能,本文主要总结下自己对python装饰器的一些理解
提示:以下是本篇文章正文内容,下面案例可供参考
在不更改函数前提下拓展函数的功能,从而使自己的代码更简洁可读性高。且如果一个函数被多个装饰器修饰则从里到外执行装饰器函数
import datetime
def outFunc(func):
def innerFunc():
start = datetime.datetime.now()
func()
end = datetime.datetime.now()
print(func.__name__,"方法执行耗时:",end - start)
return innerFunc
@outFunc
def test():
print('a')
test()
被装饰的函数若存在的参数,则只需要在装饰函数内函数中传入可变参数即可
mport datetime
import time
def outFunc(func):
def innerFunc(*args,**kwargs):
start = datetime.datetime.now()
func(*args,**kwargs)
end = datetime.datetime.now()
print(end-start)
return innerFunc
@outFunc
def test(a):
print('开始执行')
time.sleep(2)
print(a)
print('结束执行')
test('monica')
此类装饰与之前装饰区别就在于外层在套一层函数,且该类装饰器可实现日志输出功能,通过传入的日志等级输出对应的日志内容
def wrapper(msg):
def outFunc(func):
def innerFunc(*args,**kwargs):
func(*args,**kwargs)
if msg=='msg':
print("{0}执行".format(msg))
return innerFunc
return outFunc
@wrapper(msg='test')
def test(a):
print(a)
无参数的类装饰器,重写__call__方法
# -*- coding: UTF-8 -*-
import datetime
import time
class Decorators():
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
startTime = datetime.datetime.now()
self.func()
endTime = datetime.datetime.now()
print(endTime-startTime)
@Decorators
def test():
print('开始执行函数')
time.sleep(3)
print('执行结束')
test()
1.有参数的类装饰器,init方法接收参数,call方法接收装饰函数,执行装饰逻辑
2.若是要装饰一个类中的函数与装饰单个函数方法相同
class Decorators():
def __init__(self,level=None):
self.level = level
def __call__(self,func):
def inner(*args,**kwargs):
print("[{level}]: the function {func}() is running...".format(level=self.level, func=func.__name__))
func(*args,**kwargs)
return inner
@Decorators(level='info')
def test(name):
print('开始执行')
print(name,'2222')
print('执行结束')
test('monica')