装饰器
装饰器来自 Decorator
的直译。什么叫装饰,就是装点、提供一些额外的功能。在 python 中的装饰器则是提供了一些额外的功能。
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
一.一个装饰器的写法
def mylog(func):
def innfunc(*args,**kwargs):
print('日志记录...,start')
func(*args,**kwargs)
print('日志记录...,end')
return innfunc
@mylog
def func1():
print('功能1')
@mylog
def func2(a,b,c):
print('功能2',a,b,c)
func1()
func2(100,200,300)
二.多个装饰器的写法
#多个装饰器
#在函数定义阶段:执行顺序是从最靠近函数的装饰器开始,自内而外的执行
#在函数执行阶段:执行顺序由外而内,一层层执行
import time
def mylog(func):
print('mylog,start!')
def innfunc():
print('日志记录,start')
func()
print('日志记录,end')
print('mylog,end!')
return innfunc
def cost_time(func):
print('cost_time,start!')
def innfunc():
print('开始计时')
start = time.time()
func()
end = time.time()
print(f'总共耗时:{end-start}')
print('cost_time,end!')
return innfunc
@mylog
@cost_time #先执行cost_time→mylog的外在函数,然后先执行mylog→cost_time的内部函数
def func2():
print('func2')
time.sleep(3)
func2()
三.带参数的装饰器典型写法
#带参数的装饰器的典型写法
def mylog(type):
def decorator(func):
def innfunc(*args,**kwargs):
if type == '文件':
print('文件中:日志记录....')
else:
print('控制台:日志记录....')
return func(*args,**kwargs)
return innfunc
return decorator
@mylog('文件')
def func2(a,b):
print('func2',a,b)
if __name__ == '__main__':
func2(100,200)
四.类装饰器的写法
#类装饰器
class MylogDecorator():
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print('日志记录...')
return self.func(*args, **kwargs)
@MylogDecorator
def func2():
print('func2')
if __name__ == '__main__':
func2()
综合练习
缓存和计时装饰器的综合练习
# 缓存和计时装饰器的综合练习
import time
class CacheDecorator():
__cache={}
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
# 如果缓存中有对应的方法名,则直接返回对应的返回值
if self.func.__name__ in CacheDecorator.__cache:
return CacheDecorator.__cache[self.func.__name__]
# 如果缓存中没有对应的方法名,则进行计算,并将结果缓存
else:
result = self.func(*args,**kwargs)
CacheDecorator.__cache[self.func.__name__] = result
return result
def cost_time(func):
def infunc(*args,**kwargs):
start = time.time()
result = func(*args,**kwargs)
end = time.time()
print(f"耗时:{end-start}")
return result
return infunc
@cost_time
@CacheDecorator
def func1_long_time():
"""模拟耗时较长,每次执行返回结果都一样的情况"""
print("start func1")
time.sleep(3)
print("end func1")
return 999
if __name__ == '__main__':
r1 = func1_long_time()
r2 = func1_long_time()
print(r1)
print(r2)
以下是心得体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。