custom_decorator

自定义装饰器

1 写一个简单的装饰器

def foo():
    print 'foo'

foo     #表示是函数
foo()   #表示执行 foo 函数

1.1 一个普通的装饰器

装饰器

import functools
def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        print('args = {}'.format(*args))
        return func(*args, **kwargs)

    return wrapper

这样就定义了一个打印出方法名及其参数的装饰器。

使用

备注

1.2 带参数的装饰器

等同于

1.3 类装饰器

在 python 中我们可以利用一个函数作为装饰器来装饰另一个函数,但是装饰器只能是函数吗 ? 当然了我们还可以使用类来作为装饰器!

这个的输出结果是:

其中 butterfly 中的 handler 都是被 protocol_json.Protocol 装饰

2 装饰器的本质

2.1 本质

变为了

2.2 装饰器加强库

decorator.py 和 wrapt 两个库是装饰器加强库,可以很方便的定义和使用装饰器函数,wrapt 比 decorator.py 功能更强些

使用 wrapt 库可以相当于对返回新函数的这块进行了封装,用户只需要实现 newfunc 的功能即可,即

原方式

现方式

3 wrapt

wrapt

3.1 不带参数的装饰器

上面的功能相当于如下功能:

3.2 带参数的装饰器

4 handler 装饰器例子

5 传送门

Last updated