# ### 装饰器 ''' 扩展函数新功能的@ 定义:替换旧函数,返回新函数,在不改变原有代码的前提下,为该函数扩展新功能; 语法:@ (语法糖) ''' # (1) 装饰器的原型 def kuozhan(func): def newfunc(): print("厕所前,蓬头垢面") func()#print("我是个屌丝") print("厕所后,精神气爽") return newfunc def func(): print("我是个屌丝") # func = kuozhan(func) func = kuozhan(func) # func = newfunc <==> func() 就是newfunc() 一样的 print(func) # func = kuozhan(func) # func() # (2) 装饰器语法@ def kuozhan(func): def newfunc(): print("厕所前,蓬头垢面") func() print("厕所后,精神气爽") return newfunc @kuozhan # func = kuozhan(func) def func(): print("我是个屌丝") ''' 方向:从下到上,把func当成一个参数给装饰器kuozhan, 返回的新函数覆盖旧函数func,func在调用时,相当于 调用newfunc(),只不过@自动帮助你实现了这一步,func = kuozhan(func) 直接调用即可. ''' func() # (3) 装饰器的嵌套 def kuozhan1(func): def newfunc(): print("厕所前,蓬头垢面1") func() print("厕所后,精神气爽2") return newfunc def kuozhan2(func): def newfunc(): print("吃饭前,洗洗手3") func() print("吃饭后,簌簌口4") return newfunc @kuozhan1 @kuozhan2 def func(): print("我是白富美5") func() ''' # 第一步: @kuozhan2 def func(): print("我是白富美5") # 结果: def func(): print("吃饭前,洗洗手3") print("我是白富美5") print("吃饭后,簌簌口4") # 第二部 @kuozhan1 def func(): print("吃饭前,洗洗手3") print("我是白富美5") print("吃饭后,簌簌口4") # 结果: print("厕所前,蓬头垢面1") # 作为一个整体调用依次 print("吃饭前,洗洗手3") print("我是白富美5") print("吃饭后,簌簌口4") print("厕所后,精神气爽2") # 整体返回 ''' # (4) 带有参数的装饰器 '''# 如果原函数带有参数, 那么返回的新函数也要带有参数,(参数一一对应)''' print("<===>") def kuozhan(func): def new_func(who,where): print("厕所前,干净整洁") func(who,where) print("厕所后,一片狼藉") return new_func @kuozhan def func(who,where): print("{}在{}里解手".format(who,where)) func("豪杰","鸟窝") print("<====>") # (5) 带有参数返回值的装饰器 """原函数怎么定义的参数,新函数就那样去定义""" def kuozhan(func): # 函数的定义处,*args,**kwargs 是收集参数 def new_func(*args,**kwargs): print("厕所前,苟延残喘") # * 和 ** 的魔术用法 *[1,2,3] **{'a':1,'b':2} 把容器里面的数据,一个一个拿出来当成参数赋给调用处的func lst = func(*args,**kwargs) print("厕所后,大言不惭") return lst return new_func @kuozhan def func(*args,**kwargs): # print(args) # print(kwargs) print(args) dictvar = {"qhy":"全海毅","hb":"胡斌","hqc":"胡启超"} # lst = {dictvar[a]:b for a,b in kwargs.items() if a in dictvar} lst = [dictvar[a]+"生产了"+b+"便便" for a,b in kwargs.items() if a in dictvar] return lst res = func("电影院","水池",qhy="15克",hb="15斤",hqc="15顿") print(res)