装饰器问题

来源: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

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

1
1
快乐的bug制造者
就是在装饰器里传参啊
2018-04-18
共1条回复

光荣交白卷哥

2018-08-06

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

0
1
光荣交白卷哥
你可以将我的代码从头到尾执行了一下,大概就了解了,望采纳
2018-08-06
共1条回复

光荣交白卷哥

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")等价于加了装饰器以后是一个效果

0
0

光荣交白卷哥

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")
0
1
光荣交白卷哥
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
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14447 学习 · 4438 问题

查看课程