请稍等 ...
×

采纳答案成功!

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

装饰器问题

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')

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

正在回答 回答被采纳积分+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
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
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下载
官方微信