Decorator

作者: roger_lyb | 来源:发表于2016-05-27 00:49 被阅读0次

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

    相关文章

      网友评论

          本文标题:Decorator

          本文链接:https://www.haomeiwen.com/subject/xyixdttx.html