装饰器

Posted liuhongshuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

1,简单的装饰器

装饰器 
  语法糖 @
  本质 一个闭包函数 
  功能 不改变原函数及其调用方式 对原函数功能进行扩展
开放封闭原则:多扩展开放 对修改封闭
技术分享图片
#装饰器 不改变原函数的调用方式 并在函数前后添加功能
#开放封闭原则:多扩展开放 对修改封闭
# import time
# def timer(func):
#     def inner():
#         start_time=time.time()
#         ret=func()#res=func1()-->res=‘---end---‘
#         end_time=time.time()
#         print(end_time-start_time)
#         return ret
#     return inner
#
# @timer#func1=timer(func1)-->inner
# def func1():
#     print(‘===========‘)
#     time.sleep(0.5)
#     print(‘**********‘)
#     return ‘---end---‘
#
# res=func1()#inner()
# print(res)
View Code

2,带参数的装饰器

技术分享图片
#带参数的装饰器
# import time
# def timer(func):
#     def inner(*args,**kwargs):
#         start_time=time.time()
#         ret=func(*args,**kwargs)#res=func1(1,2,3)-->‘---end---‘
#         end_time=time.time()
#         print(end_time-start_time)
#         return ret
#     return inner
#
# @timer#func1=timer(func1)-->inner  #语法糖
# def func1(a,b,c):
#     print(‘===========‘,a,b)
#     time.sleep(0.5)
#     print(‘**********‘,c)
#     return ‘---end---‘
#
# res=func1(1,2,c=3)#inner(1,2,c=3)
# print(res)
View Code

3,装饰器的固定格式

技术分享图片
#装饰器的固定格式
# def wrapper(func):
#     def inner(*args,**kwargs):
#         #在被装饰函数之前要做的事
#         res=func(*args,**kwargs)
#         #在被装饰函数之后要做的事
#         return res
#     return inner
View Code

4,wraps版装饰器(为了不让原函数的一些信息失效)

技术分享图片
#wraps版本
# from functools import wraps
# def wrapper(func):
#     @wraps(func)
#     def inner(*args,**kwargs):
#         #在被装饰函数之前要做的事
#         res=func(*args,**kwargs)
#         #在被装饰函数之后要做的事
#         return res
#     return inner
# @wrapper#func=wrapper(func)-->inner
# def func():
#     ‘‘‘
#     wraps 使函数保留原本的信息
#     ‘‘‘
#     print(‘welcome‘)
#     return ‘----end----‘
#
# res=func()#inner()
# print(res)
# print(func.__name__)#查看函数名
# print(func.__doc__)#查看注释信息
View Code

5,装饰器的控制

技术分享图片
#装饰器的控制与终止
# import time
# FLAG=False
# def time_out(flag):
#     def timer(func):
#         def inner(*args,**kwargs):
#             if flag:
#                 start_time=time.time()
#                 res=func(*args,**kwargs)#res=func1(1,2,3)-->‘---end---‘
#                 end_time=time.time()
#                 print(end_time-start_time)
#                 return res
#             else:
#                 res=func(*args,**kwargs)
#                 return res
#         return inner
#     return timer
# @time_out(FLAG)# @timer-->func1=timer(func1)-->inner
# def func1(a,b,c):
#     print(‘===========‘,a,b)
#     time.sleep(0.5)
#     print(‘**********‘,c)
#     return ‘---end---‘
#
# res=func1(1,2,c=3)#inner(1,2,c=3)
# print(res)
View Code

6,多个装饰器装饰同一个函数

技术分享图片
#多个装饰器装饰同一个函数(俄罗斯套娃)
# def wrapper1(func):
#     def inner1():
#         print(‘wrapper1,before func‘)
#         res=func()#inner2()
#         print(‘wrapper1,after func‘)
#         return res
#     return inner1
#
# def wrapper2(func):
#     def inner2():
#         print(‘wrapper2,before func‘)
#         res=func()#func()
#         print(‘wrapper2,after func‘)
#         return res
#     return inner2
#
# @wrapper1#func=wrapper1(func)-->wrapper1(inner2)-->inner1
# @wrapper2#func=wrapper2(func)-->inner2
# def func():
#     print(‘in func‘)
#     return ‘---end---‘
#
# res=func()#inner1()
# print(res)
View Code

 


以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码