装饰器说明
Python中的装饰器是一种可以装饰其它对象的工具。
该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数、类来实现。
装饰器本身需要接受一个被装饰的对象作为参数,该参数通常为函数、方法、类等对象。
装饰器需要返回一个对象,该对象可以是 经过处理的原参数对象、一个包装且类似原参数的对象;或者返回一个不相干内容(通常不建议使用)
相信通过上述一段文字的描述,大家应该更加的迷惑了!所以下面我们就结合代码来理解Python中的装饰器。
装饰器分类
最简单的装饰器
def warp(obj):
return obj
没错!!!这就是最简单的装饰器,并且是一个没有任何用处的装饰器。但是它确实是一个装饰器,并且可以用的很好。比如:
@warp # 等价于 foo = warp(foo)
def foo():
print('hello decorator!')
foo() # => hello decorator!
而上面使用了装饰器的代码,其实我们可以通过其它方式达到相同的效果。具体见下:
def foo():
print('hello decorator!')
foo = warp(foo)
foo() # => hello decorator!
So,通过最简单的代码,我们可以发现装饰器其实就是接受了一个函数(对象),并且返回了一个函数(对象)的函数(可调用对象)。
用于修改对象的装饰器
在理解了装饰器的含义之后,再来看一个稍微有点作用的装饰器。代码如下:
def warp(obj):
obj.name = 'python'
return obj
这个装饰器在上一个例子的基础上,只添加了一行代码,但是却有了实际的作用。它的作用就是给被装饰的对象,添加一个name属性并且设置值为python。这个装饰器的使用效果如下:
@warp # => Bar = warp(Bar)
class Bar(object):
def __init__(self):
pass
print(Bar.name) # => python
可以看到实际的使用过程中,warp装饰器已经成功的给Bar对象添加了name属性。除了给类对象添加属性之外,它还可以给函数对象添加属性。