defdeco(*args):def_deco(func):def__deco():print("before%scalled[%s]."%(func.__name__,args))func()print("after%scalled[%s]."%(func.__name__,args))return__decoreturn_deco@deco("mymodule")#可用defmyfunc():print("myfunc()called.")@deco()#也可用defmyfunc2():print("myfunc2()called.")@deco#报错TypeError:_deco()takesexactly1argumentdefmyfunc3():print("myfunc2()called.")myfunc()myfunc2()myfunc3()
2 回答
慕桂英546537
TA贡献1848条经验 获得超10个赞
没有参数的@deco其实就是deco(myfunc3),所以需要对参数做个判断就行。importtypesdefdeco(*args):def_deco(func):def__deco():print("before%scalled[%s]."%(func.__name__,args))func()print("after%scalled[%s]."%(func.__name__,args))return__deco#当直接使用@deco定义的时候第一个参数为函数iflen(args)==1andtype(args[0])istypes.FunctionType:return_deco(args[0])return_deco
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
defdecorator(func_text):defdecorator1(func):defwapper(*args,**kw):print'beforefunc...%s'%func_textfunc(*args,**kw)print'afterfunc...%s'%func_textreturnwapperdefdecorator2(*args,**kw):print"before...%s"%func_text.__name__func_text(*args,**kw)print"after...%s"%func_text.__name__ifhasattr(func_text,'__call__'):returndecorator2else:returndecorator@decoratordeffoo2(a,b):printaprintbprint"foo2"@decorator('decorator')deffoo3(a,b):printaprintbprint"foo3"foo2('a','b')foo3('a','b')@deco和@deco()是不一样的
添加回答
举报
0/150
提交
取消