装饰器目的是:让一个原有函数不改变代码,不改变内部逻辑,使这个函数执行前增加一些额外功能,或者执行后加一些功能。
装饰器本质是一个嵌套函数。基本结构如下:
def outer(func)
def inner(*args,**kwargs)
print('前面的功能')
ret=func(*args,**kwargs)
print('后面的功能')
retunr ret
return inner
要把outer变成装饰器,要用@+函数名形式,即@outer放在被装饰聚函数前面。如:
@outer
def f1(a,b,dic={name:hao,sex:man})
print(a,b)
return dic
装饰器作用有两个:
1、代码被解析器载入后,自动执行装饰器函数(如例子中outer函数),并将被装饰的函数名(上例中的f1)作为能参数传给装饰器函数。注意:这就是outer函数有个参数的原因(例子中outer(func)中func参数)。
2、装饰函数将返回值重新赋值给被装饰函数,例子中:返回的是inner,它是outer的一个内嵌函数名,这样f1=inner。
注意:因为f1可能有参数,执行f1时就执行inner,因此定义
def inner(*args,**kwargs),
又因为f1也可能有返回值,因此inner中要有这样代码:
.......
ret=func(*args,**kwargs)
.........
return ret #这句定要放在inner最后一句。
装饰器实际上是借用面向对象的封闭开放原则,让被装饰函数保留原有功能(封闭),给它增加新的功能(开放)。

网友评论