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

小白不懂代码逻辑,求问!!

def log(prefix):

    def log_decorator(f):

        def wrapper(*args, **kw):

            print ('[%s] %s()...' % (prefix, f.__name__))

            return f(*args, **kw)

        return wrapper

    return log_decorator


@log('DEBUG')

def test():

    pass

print (test())

#print(test())->print(log_decorator())->print(wrapper)

#???没有调用wrapper()为啥会执行里面的代码???


正在回答

3 回答

这段代码这样写:

xylflz

0 回复 有任何疑惑可以回复我~

def log(prefix):                                              #222222创建log函数 传入装饰器参数 log('DEBUG')

    def log_decorator(f):                                #44444创建log_decorator函数传入被装饰函数,f=test()为参数

        def wrapper(*args, **kw):                    #666666创建 wrapper函数 参数为任意参数

            print ('[%s] %s()...' % (prefix, f.__name__))  #888打印第一个%s为括号中prefix='DEBUG',2为test()函数的名字

            return f(*args, **kw)                   # 7777777 返回 执行f(*args, **kw) 函数 f 这里为 test()函数

        return wrapper                              #555555555返回执行 wrapper函数

    return log_decorator                         #333333333 返回执行log_decorator函数


@log('DEBUG')                                       #11111带参数的的代码装饰器参数为‘DEBUG’

def test():                                               #被装饰的函数

    pass

print (test())                                           纯属个人的理解大家看看是不是这样的


4 回复 有任何疑惑可以回复我~
#1

慕桂英2065712

返回的是函数 没有调用 为什么会执行呢??
2020-02-10 回复 有任何疑惑可以回复我~

存在装饰器。test怎么来的?log返回值。log返回值是什么?log_decorator。其返回值是什么?wrapper。所以先执行的wrapper,将函数返回给log_decorator,再返回给log,再返回给test。

1 回复 有任何疑惑可以回复我~
#1

Yexiaomo

test函数哪一步执行的,能讲一下吗
2019-09-07 回复 有任何疑惑可以回复我~
#2

林丶忧 回复 Yexiaomo

test函数被定义完之后,传入函数名test到log函数进行装饰,即test = log('Debug')(test)。而log('Debug')返回的是log_decorator这一函数名,与后半部分的(test)组合成函数的执行log_decorator(test),其返回值为wrapper这一函数名。最终效果就是test = wrapper,当执行test()的时候,可以认为执行的是wrapper函数,所以才会有print输出。但是打印出来的f.name是前面log_decorator的参数,也就是test函数名。
2019-09-16 回复 有任何疑惑可以回复我~
#3

Yexiaomo 回复 林丶忧

先谢谢了,Thanks♪(・ω・)ノ
2019-09-17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255779    人
  • 解答问题       2946    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

小白不懂代码逻辑,求问!!

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信