Python学习---第5天---装饰器


1、什么是装饰器


就是把原来的函数装饰一下,形成一个新的函数,使其在原有功能的基础上添加一些新的功能,而又不用去修改原来的代码。

2、装饰器的作用


3、装饰器的使用方法

 

注:

1、书上说的太复杂,一句话总结就是:经过@log的作用,函数foo变成了loged_foo。调用log就相当于调用函数loged_foo,而log的返回值就是loged_foo的返回值。

2、1出传入什么样的参数,要依靠3处的定义(函数foo完全变成了函数loged_foo);3处接收到的参数,可以用于4处,当然也可做他用;4处传入的参数,依赖2处的定义。

4、编写无参数decorator(类比java的注解)


修饰多个参数的函数的修饰器:

    

  def log(f):

    def fn(*args, **kw):

        print 'call ' + f.__name__ + '()...'

        return f(*args, **kw)

    return fn

现在,对于任意函数,@log 都能正常工作。

 @log

 def factorial(n):

    return reduce(lambda x,y: x*y, range(1, n+1))

 print factorial(10)

 或者:

 @log

 def add(x, y):

    return x + y

 print add(1, 2)


5、编写带参数decorator

  def log(f):

    def fn(x):

        print 'call ' + f.__name__ + '()...'

        return f(x)

    return fn

发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。

如果有的函数非常重要,希望打印出'[INFO] call xxx()...',有的函数不太重要,希望打印出'[DEBUG] call xxx()...',这时,log函数本身就需要传入'INFO'或'DEBUG'这样的参数,类似这样:

@log('DEBUG')

def my_func():

    pass

把上面的定义翻译成高阶函数的调用,就是:

my_func = log('DEBUG')(my_func)

上面的语句看上去还是比较绕,再展开一下:

log_decorator = log('DEBUG')

my_func = log_decorator(my_func)

上面的语句又相当于:

log_decorator = log('DEBUG')

@log_decorator

def my_func():

    pass

所以,带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数:

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

执行结果:

[DEBUG] test()...

None

对于这种3层嵌套的decorator定义,你可以先把它拆开:

# 标准decorator:

def log_decorator(f):

    def wrapper(*args, **kw):

        print '[%s] %s()...' % (prefix, f.__name__)

        return f(*args, **kw)

    return wrapper

return log_decorator

# 返回decorator:

def log(prefix):

    return log_decorator(f)

拆开以后会发现,调用会失败,因为在3层嵌套的decorator定义中,最内层的wrapper引用了最外层的参数prefix,所以,把一个闭包拆成普通的函数调用会比较困难。不支持闭包的编程语言要实现同样的功能就需要更多的代码。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值