学习了装饰器,是一种在运行函数期间动态增加功能的方式,并且不改变函数本身的代码。虽然具体的作用目前还没体现出来,暂且如此记忆
装饰器一般用@符号来表示使用,放在定义函数的上一行,表示装饰。而且好像要自己去编写装饰器的样子! 如
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
这样就能打出来了。