参考博客https://blog.youkuaiyun.com/star714/article/details/71045305
https://www.jianshu.com/p/7a644520418b
装饰器的理解
简单的理解就是:装饰原有的函数。什么意思呢?比如有一个函数func(a, b),它的功能是求a,b的差值,我现在有一个需求,就是想对函数功能再装饰下,求完差值后再取绝对值,但是不能在func函数内部实现,这时候就需要装饰器函数了,比如func = decorate(func)函数,将func函数作为参数传递给decorate函数,由decorate来丰富func函数,丰富完成后再返回给func,此时func的功能就丰富了。
注意:设计模式中也有装饰器模式
例1:理解装饰器
def sub(a, b):
return a+b
print(sub(-1,-4))
这是原来的函数,经过装饰后为,
第一种装饰的方式为:(不使用@)
def decorate(func):
def inner(a, b):
ret = func(a, b)
return abs(ret)
return inner
def sub(a, b):
return a+b
#对sub函数进行装饰
sub=decorate(sub)
print(sub(-1, -4))
p 第二种装饰的方式(使用@)
def decorate(func):
def inner(a, b):
ret = func(a, b)
return abs(ret)
return inner
@decorate
def sub(a, b):
return a+b
sub(-5,-10)
经过装饰后的结果一定为正,本质上将sub=decorate(sub)替换成@decorate,并且放置到所要修饰的函数之前。
通过这个例子,对装饰的本质和写法有了一定的了解。
第二个例子:
def spamrun(fn):
#*args可以接受序列的输入参数。当函数的参数不确定时,可以使用*args。
def sayspam(*args):
print("经过修饰")
fn(*args)
return sayspam
@spamrun
def useful(a,b,c):
print(a*b*c)
useful(-2,5,3)
很明显,这个例子的useful函数要经过spamrun装饰器装饰
输出结果为
形象的理解两种实现方式:
等价于
结果:
第三个例子:多次使用
依次使用装饰器@spamrun1@spamrun2
等价于
结果: