码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器

时间:2019-04-15 16:00:59      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:ora   cto   ===   --   func   闭包函数   使用   *args   strong   

函数的开放封闭原则:  对扩展是开放的 对修改是封闭的

装饰器的主要功能:

  在不改变函数调用方式的基础上在函数的前、后添加功能。

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

 

 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

 

装饰器

标签:ora   cto   ===   --   func   闭包函数   使用   *args   strong   

原文地址:https://www.cnblogs.com/OB19227/p/10711067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!