装饰器模式定义:动态地给一个对象添加一些额外的职责。
比如一个函数或者接口,你不想修改它,又想添加一些额外的功能
def aaa (): print("苹果,西瓜,火龙果") def bbb(): print("我今天买了:") aaa() bbb() 在aaa()函数外面在加一层函数,添加功能 ------------------------------------------- 开始一个函数只打印“苹果,西瓜,火龙果” 我现在需要强调,“我今天买的”,就添加一个函数,打印 “我今天买了:”然后直接调用新定义的函数,就完成功能了。 这个例子简单所以有些多此一举,如果是一个1000多行的函数,或者 别人提供的无法更改的接口呢?就凸显出重要性了。
我今天买了:
苹果,西瓜,火龙果------------------------------------------------------------------------------------------------
换一种写法:
def aaa (): print("苹果,西瓜,火龙果") def bbb(x): print("我今天买了:") x() bbb(aaa) x代表参数,bbb函数调用的时候括号里面传入aaa,则在bbb函数里面x变成aaa,x()就变成aaa(),跟上面代码显示一样了。 装饰器闭包写法:
def aaa (): print("苹果,西瓜,火龙果") def bbb(x): def ccc(): print("我今天买了:") x() return ccc aaa=bbb(aaa)#如果注销的这句,就是调用aaa()函数打印出“苹果,西瓜,火龙果”,用其他变量也可以,比如:aa,cc,bb等, aaa() aa=bbb(aaa) aa()#效果跟用aaa字符一样。用aaa很容易跟aaa()函数搞混,且用这个条件后,aaa()函数就无法直接调用了,新手难以理解。 另外一种写法:
def bbb(x): def ccc(): print("我今天买了:") x() return ccc @bbb def aaa (): print("苹果,西瓜,火龙果") aaa()
先定义bbb,然后@bbb,下一行接着aaa()函数,节省了2行代码。格式顺序不能变
这里调用aaa(),就是打印修改后的内容,这就是所谓的装饰器。