Python 的装饰器如何既支持 @deco 也支持 @deco(p) 调用?

defdeco(*args):
def_deco(func):
def__deco():
print("before%scalled[%s]."%(func.__name__,args))
func()
print("after%scalled[%s]."%(func.__name__,args))
return__deco
return_deco
@deco("mymodule")#可用
defmyfunc():
print("myfunc()called.")
@deco()#也可用
defmyfunc2():
print("myfunc2()called.")
@deco#报错TypeError:_deco()takesexactly1argument
defmyfunc3():
print("myfunc2()called.")
myfunc()
myfunc2()
myfunc3()
小怪兽爱吃肉
浏览 522回答 2
2回答

慕桂英546537

没有参数的@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

米琪卡哇伊

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()是不一样的
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript