最近在看OpenStack源代码的时候看到装饰器的使用,以前没有遇到过,所以学习一下,顺便记录一下。
装饰器的作用:
装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数
装饰器用法示例:
1,没有参数的装饰器
没有参数的装饰器会直接接受原函数作为参数,定义如下:
def deco(func):
if func.__doc__ == None:
print func,'has no __doc__,its a bad habit.'
else:
print func,':',func.__doc__,'.'
return func
#在这时已经开始运行装饰器
@deco
def func1():
'I have a __doc__'
print 'func1 is running'
@deco
def func2():
print 'func2 is running'
func1()
func2()
###########输出结果:###########
<function func1 at 0x0000000002ACD9E8> : I have a __doc__ .
<function func2 at 0x0000000002AD3048> has no __doc__,its a bad habit.
func1 is running
func2 is running
如果去掉最后的func1()和func2()的调用,会输出结果的前两句。所以装饰器在语句:@deco然后定义函数之后已经开始运行,但是原函数要等到调用时才运行。
2,有参数的装饰器
这是装饰器函数不能把原函数名当做参数传入,必须在里面再创建一个装饰器接受原函数名作为参数。定义如下:
def outerdeco(args):
def innerdeco(func):
print func,args
return func
return innerdeco
@outerdeco('outerdeco-args')
def func3():
print 'func3 is running'
func3()
############输出结果:###########
<function func3 at 0x0000000002B61198> outerdeco-args
func3 is running
3,装饰器有参数且函数也有参数的装饰器:
最外层的装饰器带着自己的参数,中间的装饰器接收原函数名作为参数,最里层的装饰器接收原函数的参数作为参数。定义如下:
def outerdeco4(args):
def innerdeco4(func):
def funcdeco(a,b):
print func,args
ret = func(a,b)
return ret
return funcdeco
return innerdeco4
@outerdeco4('Add two numbers.')
def func4(a,b):
print 'The answer is :',a + b
return a + b
func4(3,5)
########输出结果:#######
<function func4 at 0x0000000002C92278> Add two numbers.
The answer is : 8
其他类型的装饰器可以由此演变而来。
总结:
总之python装饰器不过就是一个针对嵌套函数的语法。
它的作用就是在函数调用方法不变的情况下,把此函数包装成另一个函数来使用 。
它的作用就是在函数调用方法不变的情况下,把此函数包装成另一个函数来使用 。
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。