python装饰器
python中最不想python风格的就是装饰器了,特别是‘@’很令新来python的人费解,不过装饰器可是很强大的功能。
装饰器语法有两种,类风格和函数风格
类风格例子:
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__@entryExitdef func1(): print "inside func1()"@entryExitdef func2(): print "inside func2()"func1()func2()
输出结果是
Entering func1inside func1()Exited func1Entering func2inside func2()Exited func2
类装饰的设计需要连个方法,包含参数为装饰函数的初始化函数和代替执行函数的__call__函数,当该python文件被编译时,先执行初始化方法,当被装饰的函数被执行的时候执行__call__方法中的内容,自己本身的执行内容也被__call__方法替代,因此把装饰函数提前在初始化方法中为__call__准备好使用。
函数风格代码比较简单:
def entryExit(f): def new_f(): print "Entering", f.__name__ f() print "Exited", f.__name__ return new_f@entryExitdef func1(): print "inside func1()"@entryExitdef func2(): print "inside func2()"func1()func2()print func1.__name__
结果同上,其中的new_f是python语法中的闭包,打印函数名称时打印了'new_f',如果想打印当前调用的函数,则可修改为
def entryExit(f): def new_f(): print "Entering", f.__name__ f() print "Exited", f.__name__ new_f.__name__ = f.__name__ return new_f