为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小怪兽爱吃肉 2019-04-16 20:26:22
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),所以需要对参数做个判断就行。
importtypes
defdeco(*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
                            
查看完整回答
反对 回复 2019-04-16
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

defdecorator(func_text):
defdecorator1(func):
defwapper(*args,**kw):
print'beforefunc...%s'%func_text
func(*args,**kw)
print'afterfunc...%s'%func_text
returnwapper
defdecorator2(*args,**kw):
print"before...%s"%func_text.__name__
func_text(*args,**kw)
print"after...%s"%func_text.__name__
ifhasattr(func_text,'__call__'):
returndecorator2
else:
returndecorator
@decorator
deffoo2(a,b):
printa
printb
print"foo2"
@decorator('decorator')
deffoo3(a,b):
printa
printb
print"foo3"
foo2('a','b')
foo3('a','b')
@deco和@deco()是不一样的
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 521 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信