Note
前段时间在 stack overflow 上看到一个关于 python decorator(装饰器)的问题,有一个人很耐心的写了一篇很长的教程。我也很耐心的看完了,获益匪浅。现在尝试翻译过来,尽量追求准确和尊重原文。不明白的地方,或翻译不好的地方,请参照原文,地址:
Understanding Python decorators
1. python的函数是对象(Python’s functions are objects)
要理解装饰器,就必须先知道,在python里,函数也是对象(functions are objects)。明白这一点非常重要,让我们通过一个例子来看看为什么。
def shout(word="yes"):
return word.capitalize()+"!"
print shout()
# outputs : 'Yes!'
# 作为一个对象,你可以像其他对象一样把函数赋值给其他变量
scream = shout
# 注意我们没有用括号:我们不是在调用函数,
# 而是把函数'shout'的值绑定到'scream'这个变量上
# 这也意味着你可以通过'scream'这个变量来调用'shout'函数
print scream()
# outputs : 'Yes!'
# 不仅如此,这也还意味着你可以把原来的名字'shout'删掉,
# 而这个函数仍然可以通过'scream'来访问
del shout
try:
print shout()
except NameError, e:
print e
#outputs: "name 'shout' is not defined"
print scream()
outputs: 'Yes!'
OK,先记住这点,我们马上会用到。python 函数的另一个有趣的特性是,它们可以在另一个函数体内定义。
def talk():
# 你可以在 'talk' 里动态的(on the fly)定义一个函数...
def whisper(word="yes"):
return word.lower()+"..."
# ... 然后马上调用它!
print whisper()
# 每当调用'talk',都会定义一次'whisper',然后'whisper'在'talk'里被调用
talk()
# outputs:
# "yes..."
# 但是"whisper" 在 "talk"外并不存在:
try:
print whisper()
except NameError, e:
print e
#outputs : "name 'whisper' is not defined"*
Read on →