python装饰器完整写法

在24中设计模式中有装饰模式,该模式的思想很简单,装饰物和被装饰物继承共同的类,然后装饰物中包含被装饰物的引用,这样就可以一层层进行装饰——可以有很多层装饰。

python中的装饰器跟这一模式类似,可以对方法进行装饰。比如对已有的函数要在其前后加上相应的预处理和后处理功能,可以使用装饰器方便的完成这一过程。

下面首先通过一个例子说明python中装饰器的用法。
假设有一个发送消息的方法sendMsg,该方法可以把传入的字符串通过网络发送出去,现在想在发送前先对消息进行加密,加密函数为encode。

def encode(func):
    def wrapper(*args, **kws):
        print('encode')
        func(*args, **kws)
    return wrapper


@encode
def sendMsg(text):
    print(text)

if __name__ == '__main__':
    sendMsg('hello world')

如上通过装饰器就实现了该功能,而原有的sendMsg函数并未做任何修改。

首先encode内部有两层函数定义,是一个高阶函数,decorator的定义就是要返回的装饰器函数,encode函数以sendMsg函数为参数,在内部封装一个新函数返回,该函数添加相应的预处理方法encode,可以继续二次调用。

如果有新的要求,即encode函数自身有参数,一个整形type来表示使用何种加密方法进行加密,这个时候就要修改上述写法,在encode中加一层函数。

def encode(type):
    def decorator(func):
        def wrapper(*args, **kws):
            print('use %d encode' % type)
            func(*args, **kws)
        return wrapper
    return decorator


@encode(1)
def sendMsg(text):
    print(text)

if __name__ == '__main__':
    sendMsg('hello world')

实际上上面的过程就是个嵌套调用的过程,等价于encode(1)(sendMsg)(‘hello world’)调用。
其实很好理解,主要就是嵌套调用。

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:python装饰器完整写法

本文链接地址:http://www.iaccepted.net/python/tutorial/116.html

相关文章



发表评论

电子邮件地址不会被公开。 必填项已用*标注