修饰器,之前一直是我比较生疏的东西,虽然知道它很强大,不过之前看到一篇文章,翻译了国外的一个修饰器版本(class式的 Decorator),我觉得更加自然。看上去要比“函数式”的方式更易读一些。
首先要了解知识点:
1:* 开头的变量表示该变量内容需被取出用做位置参数。*args 可以表示在调用函数时从迭代器中取出位置参数, 也可以表示在定义函数时接收额外的位置参数。
2:当定义一个函数时,使用 **kwargs 来表示所有未捕获的关键字参数将会被存储在字典 kwargs 中。
class entryExit(object):
def __init__(self, f):
self.f = f
def __call__(self):
print "Entering", self.f.__name__
self.f()
print "Exited", self.f.__name__
@entryExit
def func1():
print "inside func1()"
func1()
The output is:
Entering func1
inside func1()
Exited func1
函数式修饰器
from functools impor twraps
def func(fn):
@wraps(fn)
def wrapper(*args):
return fn(*args)
return wrapper
@func
def test_func(n)
pass
test_func(None)
二:当然,我们可以了解下,内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。
不过,不需要太频繁用到这些,毕竟不是面向对象编程
三:函数是有几个特殊属性比如函数名,在被装饰后,上例中的函数名foo会变成包装函数的名字
functools模块wrapper,如果你希望使用反射,可能会导致意外的结果。这个装饰器可以解决这个问题,它能将装饰过的函数的特殊属性保留。
网友评论