请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

装饰器问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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')
 
= logging(level='INFO')(say)
m('hello')

上面直接使用@和下面调用结果不应该是一样的吗?可结果明显不一样

正在回答 回答被采纳积分+3

插入代码

4回答

吃小锅米线 2018-04-18 17:36:22

兄弟,你这嵌套了多少层呀?

1 回复 有任何疑惑可以回复我~
光荣交白卷哥 2018-08-06 13:20:21

这个调用看起来和你的是一样的效果,但是实际上并不是一样。因为你的m在调用say的时候,say函数本身已经被logging这个装饰器污染了,所以装饰器简写本身调用一次,以及手写的装饰器本身调用一次,装饰器调用的时候,主体是say,函数定义装饰器的调用的时候,主题是inner_warapper,于是结果是调用了两次,所以显示的结果是调用两次。

0 回复 有任何疑惑可以回复我~
  • 你可以将我的代码从头到尾执行了一下,大概就了解了,望采纳
    回复 有任何疑惑可以回复我~ 2018-08-06 13:21:06
光荣交白卷哥 2018-08-06 13:17:19
1
2
3
4
5
6
7
8
9
10
11
12
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")等价于加了装饰器以后是一个效果

0 回复 有任何疑惑可以回复我~
光荣交白卷哥 2018-08-06 13:14:55
1
2
3
4
5
6
7
8
9
10
11
12
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")
0 回复 有任何疑惑可以回复我~
  • 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")
    回复 有任何疑惑可以回复我~ 2018-08-06 13:15:25
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号