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

@符号函数代入问题

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

如上所示,在学习python进阶2-13时看到的代码,但是不太理解这4个函数之间的嵌套关系。

按照我的理解,我觉得@之前的是定义了这样一个函数:log(log_decorate(wrapper(*args,**kw),f),prefix)

但是

@log('DEBUG')
def test():
   pass

这个语句就不太理解了,在我看来,它是定义prefix='DEBUG',然后把test作为f,代入了上面的函数?是这样吗?

@这里学的有点绕。。。请前辈多多指点。

正在回答

1 回答


* 带参数的装饰器
 def log(unit):   #装饰器第一层传装饰器参数
     def do_log(f):    #装饰器第二层传被装饰函数
         def wrapper(*argv, **kw):   #装饰器第三层,处理装饰操作
             if unit == 1:
                pref = '[DEBUG]'
            else:
                pref = '[WARN]'
            print(pref+'执行函数日志'+f.__name__)
            return f(*argv, **kw)    #装饰器第三层返回被装饰函数
         return wrapper      #装饰器第二层返回装饰操作函数
    return do_log      #装饰器第三层返回装饰器
 @log(1)
 def foo():
     print('i am foo')

这是我的理解 希望可以帮到你

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

特尔法尔加罗 提问者

这个foo()是作为哪个函数的自变量啊,log()吗?
2017-08-17 回复 有任何疑惑可以回复我~
#2

疯狂的Camaro 回复 特尔法尔加罗 提问者

foo()就是被装饰的函数
2017-08-17 回复 有任何疑惑可以回复我~
#3

qq_巴黎魅影_0

用你这个代码运行出错哎 可以帮忙看看吗
2017-09-12 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

@符号函数代入问题

我要回答 关注问题
微信客服

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

帮助反馈 APP下载

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

公众号

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