装饰器问题
来源:12-13 装饰器 六
快乐的bug制造者
2018-04-18
def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print(level + ": enter function " + func.__name__) return func(*args, **kwargs) return inner_wrapper return wrapper @logging(level='INFO') def say(something): print("say {}!".format(something)) if __name__ == '__main__': say('hello') m = logging(level='INFO')(say) m('hello')
上面直接使用@和下面调用结果不应该是一样的吗?可结果明显不一样
写回答
4回答
-
吃小锅米线
2018-04-18
兄弟,你这嵌套了多少层呀?
112018-04-18 -
光荣交白卷哥
2018-08-06
这个调用看起来和你的是一样的效果,但是实际上并不是一样。因为你的m在调用say的时候,say函数本身已经被logging这个装饰器污染了,所以装饰器简写本身调用一次,以及手写的装饰器本身调用一次,装饰器调用的时候,主体是say,函数定义装饰器的调用的时候,主题是inner_warapper,于是结果是调用了两次,所以显示的结果是调用两次。
012018-08-06 -
光荣交白卷哥
2018-08-06
def logging(level): def wrapper(func): def inner_wrapper(*args,**kwargs): print(level+ "enter function "+func.__name__) return func(*args,**kwargs) return inner_wrapper return wrapper @logging(level='INFO') def say(something): print("say {}!".format(something)) say("hello")
这两段代码,一段是完全不用装饰器的代码,一段是用了装饰器的代码。两者的输入是完全一致的。logging(level="INFO")(say)("hello")等价于加了装饰器以后是一个效果
00 -
光荣交白卷哥
2018-08-06
def logging(level): def wrapper(func): def inner_wrapper(*args,**kwargs): print(level+ "enter function "+func.__name__) return func(*args,**kwargs) return inner_wrapper return wrapper def say(something): print("say {}!".format(something)) logging(level='INFO')(say)("hello")
012018-08-06