python函数式编程中的装饰器

学习了装饰器,是一种在运行函数期间动态增加功能的方式,并且不改变函数本身的代码。虽然具体的作用目前还没体现出来,暂且如此记忆

装饰器一般用@符号来表示使用,放在定义函数的上一行,表示装饰。而且好像要自己去编写装饰器的样子! 如

def now():
    print 2016-8-27

这一个函数是打印某个时间点,但是现在想在其上一行添加文字,可以使用装饰器的功能。

先编写一个decorator:

def log(func):
    def wrapper(*args, **kw):
        print 'before %s' % func.__name__
        return func(*args, **kw)
    return wrapper
运行后得到
>>> now()
before now:
2016-8-27

这就是不改动now的情况下在之前加上所需要的语句。
也可以把‘before’设定成参数 由用户输入:

import functools
def log(test):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print '%s %s' % (test, func.__name__)
            return func(*args, **kw)
        return wrapper
    return decorator

还有一个functools要加入的 先import functools

再 在wrapper的上一行打上@functools.wrap(func)

(目前猜测意思是将wrapper的返回值作为原函数来使用,这样子就不会出现名称混淆的问题?)

老师的解释 : 用func.__name__ 函数来查看func的名称 如果前后不一致的话 某些依赖函数签名的代码执行就会出错

见到再说吧


作业要求在函数前后分别打上字符串

但是在操作过程中发现return func(*args, **kw)之后就没下文了,认为是return结束了本段定义,因此要想办法避开return

所以先将func(*args, **kw)赋值给一个变量f

再打出后面的字符串。

import functools

def log(test):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
             print 'Before'
             f = func(*args, **kw)
             print 'After'
             return f
        return wrapper
    return decorator

这样就能打出来了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值