Decorator

2016-05-27  本文已影响0人  roger_lyb

修饰器,之前一直是我比较生疏的东西,虽然知道它很强大,不过之前看到一篇文章,翻译了国外的一个修饰器版本(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,如果你希望使用反射,可能会导致意外的结果。这个装饰器可以解决这个问题,它能将装饰过的函数的特殊属性保留。

上一篇下一篇

猜你喜欢

热点阅读