装饰器
Posted ob19227
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
函数的开放封闭原则: 对扩展是开放的 对修改是封闭的
装饰器的主要功能:
在不改变函数调用方式的基础上在函数的前、后添加功能。
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
1 ===========================#装饰器的基本形态============================= 2 def 装饰器名 ( 被装饰主函数名 ): 3 def 内层函数名 ( 被装饰主函数参数 ): 4 先执行 被装饰主函数还未执行 前 添加的操作 #装饰器操作 5 V = 被装饰主函数名() 6 再执行 被装饰主函数执行结束 后 添加的动作 #装饰器操作 7 return V #(被装饰函数的返回值)(可有可无) 8 return 内层函数名 #这里是装饰器函数的返回值,return 的是内层函数地址 9 @装饰器名 <=====> 被装饰主函数名 = 装饰器名 (被装饰主函数名) 10 # 实质上是被装饰主函数名 = 装饰器函数的返回值,也就是内层函数名 11 def 被装饰函数名 ( 被装饰函数参数 ): #这里调用主函数,因为装饰器而等于调用内层函数 12 被装饰函数,也就是主体函数的函数体 13 return 主体函数的返回值 #(可有可无) 14=========================================================================
#=====================装饰器基本形态=========================
1 def wrapper ( func ): 2 def inner ( *args **kwargs ): 3 print(‘函数执行前添加的动作‘) 4 ‘V‘ = func( *args **kwargs ) 5 print(‘函数执行后添加的动作‘) 6 return V 7 return inner 8 @wrapper #func = wrapper ( func )--返回值-->inner 9 def func ( *args **kwargs ): 10 print(‘这是主函数体‘) 11 return V
===========================================================
在函数使用装饰器后,查看注释信息方法不能用,这是需要使用functool模块的wraps功能
1 from functools import wraps 2 3 def deco(func): 4 @wraps(func) #加在最内层函数正上方 5 def wrapper(*args,**kwargs): 6 return func(*args,**kwargs) 7 return wrapper 8 9 @deco 10 def index(): 11 ‘‘‘哈哈哈哈‘‘‘ 12 print(‘from index‘) 13 14 print(index.__doc__) #查看函数注释 15 print(index.__name__) #查看函数名 16 17 装饰器——wraps demo
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章