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