Crossin的编程教室

标题: 问一个关于装饰器的 [打印本页]

作者: kiss    时间: 2016-8-10 00:00
标题: 问一个关于装饰器的
我的问题是,为什么装饰器所装饰的方法,被调用的时候,不会执行装饰器中的代码,新手求指导!

代码如下:
#encoding=utf-8
def info():
    print "调用Info"
    return "info()"
print "---普通模式---"
res = info()
print "调用结果为:" + res;
print "--------------"

def decoInfo(function):
    print "[DEBUG] 调用函数之前"
    return function

print "---装饰器模式---"
info = decoInfo(info)#只调用一次装饰器的代码 ???
print "--- 完成装饰 ---"
res = info()#此处仍为旧的代码 ???
res2 = info()
print "调用结果为:" + res;
print "调用结果为:" + res2;
print "----------------"
运行结果如下:
---普通模式---
调用Info
调用结果为:info()
--------------
---装饰器模式---
[DEBUG] 调用函数之前
--- 完成装饰 ---
调用Info
调用Info
调用结果为:info()
调用结果为:info()
----------------




作者: crossin先生    时间: 2016-8-10 10:36
info = decoInfo(info)
这句执行完,info就已经被赋值为一个函数了,下次调用info(),decoInfo就不会再执行了
后面那个不是“仍为旧的代码”,只是你新旧代码都是同一个函数
作者: kiss    时间: 2016-8-10 22:33
crossin先生 发表于 2016-8-10 10:36
info = decoInfo(info)
这句执行完,info就已经被赋值为一个函数了,下次调用info(),decoInfo就不会再执行 ...

谢谢,我理解错误了.
我一开始理解为 info重新指向了decoInfo 这个函数了
作者: crossin先生    时间: 2016-8-11 11:13
kiss 发表于 2016-8-10 22:33
谢谢,我理解错误了.
我一开始理解为 info重新指向了decoInfo 这个函数了

那就是 info = decoInfo ,不是调用




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5