python之编写带参数decorator

在学习带参数的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小白跟着我一起学习:

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值