旅の途中
你知道阿基米德原理吗?

导航

 

作用

在不修改原函数定义的前提下,动态地增加函数的功能。

实现方式

通过定义一个高阶函数,接受被装饰的函数作为参数,返回一个包装函数。

例子

一个打印helloworld的函数,我们需要在函数执行前打印函数名。

def log(func):
    def wrapper(*args,**kw):
        print('call %s():'%func.__name__)
        return func(*args,**kw)
    return wrapper

@log # 等同于 msg=log(msg)
def msg():
    print('hello, world')

当给msg加上log的装饰器后,msg实际上已经是wrapper函数了。(print(msg.__name__)结果为wrapper)但有时我们需要原函数名,所以我们可以给wrapper加上functools模块里面的wraps装饰器。

import functools
def log(func):
    @functools.wraps(func)
    def wrapper(*args,**kw):
        print('call %s():'%func.__name__)
        return func(*args,**kw)
    return wrapper

@log # 等同于 msg=log(msg)
def msg():
    print('hello, world')

当然我们也可以自己实现wraps装饰器

def wraps(func1):
    def decorator(func2):
        def wrapper(*args,**kw):
            return func2(*args,**kw)
        wrapper.__name__=func1.__name__
        return wrapper
    return decorator
posted on 2017-09-27 15:32  CknightX  阅读(92)  评论(0编辑  收藏  举报