在学习带参数的decorator之前,我们先回顾下无参数的decorator。以@log装饰器为例讲解:
无参数decorator
def new_fn(f):
def fn(x):
print 'call '+f.__name__+'()'
return f(x)
return fn
@new_fn
def f(x):
return x*x
print f(2)
==> call f()
==> 4
像这种装饰器的参数除了原函数以外没有其他参数的情况,称为无参数的decorator。
带参数decorator
当函数非常重要时,需要打印出 [important] call xx();普通函数需要打印出 [debug] call xx()。这就需要将important、debug传入装饰器,此时装饰器就有了除原函数以外的其他参数。
带参数的decorator的运行过程:需要先将带参数的decorator转变为无参数decorator,然后再按照无参数decorator进行运行。
def new_fn(text):
def decorator_new_fn(f):
def fn(x):
print ('[%s] call ' + f.__name__ +'()') % (text)
return f(x)
return fn
return decorator_new_fn
@new_fn('important')
def f(x):
return x*x
print f(3)
==> [important] call f()
==> 9
解释下上面代码:先将text参数传给装饰器 new_fn(text), 然后再将此引用给 decorator_new_fn(f),decorator_new_fn(f)就相当是无参数时的装饰器了。之后就按照无参数装饰器编写就可以了。
带参数的装饰器就好如 f = new_fn('important')(f)。这样还有些饶,不好理解,为了方便理解,一步步的引用过程如下:
decorator_new_fn = new_fn('important')
f = decorator_new_fn(f)
上面的语句又可进一步写为:
decorator_new_fn = new_fn('important')
@decorator_new_fn
上面的语句又可进一步写为:
@new_fn('important')
这节内容我是觉得不大好懂的,当时我学习的时候,是花费了好久才稍微懂点,这节内容与前面的闭包、高阶函数都有联系,需要前面的掌握好,这节理解起来才会毫不费力。近几天我又回头学习了闭包、高阶函数的内容,也顺带回顾了下tuple、dist(原来学习的都还给老师了 ==)。我的python基础还有两节结束,最后几节难度提升了,而且需要前面学习过的知识,由于前面的有遗忘,或是当时没掌握好的,近几天又回头学习了遍。等我的python基础全部学完后,我会再重新刷遍python基础,并更新公众号内容。大家可以关注我的公众号,适合python小白跟着我一起学习: