简单来说,装饰器的作用是在不改变程序原有结构的情况下,为程序添加额外的功能,同时装饰器也是面向对象编程语言中设计模式中比较常用而且经典的模式.
装饰器如何实现呢?
装饰器的核心思想是,建立一个装饰器,然后将被装饰的对象(可调用)传入装饰器中,装饰器额外添加方法(装饰),同时再把传入的对象(被装饰的对象)的方法执行一次,这样,对象就得到了加强..
那么问题来了,python装饰器到底是装饰什么的?
总结来说,python装饰器装饰的是可调用(callable)对象的,一般来说就是装饰函数的,但是若一个类定义了call方法也是一个可调用对象
那么问题又来了,什么才是python的装饰器呢?
这个问题就得从python装饰器的实现方式说起,笔者刚开始学习python装饰器的时候,搜了几篇博客,实现方法都不一样,把自己都搞晕了,也走了不少弯路.python由于是动态语言类型,所以实现的方式有很多种,可以函数装饰函数,函数装饰类,类装饰函数,类装饰类都可以,(不像java这种函数必须封装在类里,所以只有类装饰类的方法)对于实现方法,我建议大家在初学的时候不用过于纠结各种方法,先搞清楚基本思想再搞懂一种实现方式就行.
1.函数装饰函数:
def decorator(fun):
def decorate_foo():
print(“decorate_foo”)
return fun()
return decorate_foo()
def foo():
print(“hello”)
decorator(foo)
这里定义了foo函数和decorator(装饰)函数,将foo作为可调用对象传入decorator,然后decorator执行额外增加的方法和foo()
上面是最简单的装饰器,python支持语法糖的格式,即在函数上加@来装饰,参考下列例子
def decorator(fun):
def decorate_foo():
print(“decorate_foo”)
return fun()
return decorate_foo
@decorator
def foo():
print(“hello”)
foo()
这样在执行foo()时会调用装饰器,这里再提一次,装饰器的核心思想就是讲被装饰对象传入装饰器,装饰器会执行被装饰对象的方法和额外的方法,这样对象就通过装饰器得到了加强.
2.类装饰函数
def foo():
print(“hello”)
class decorator():
def init(self,decorate_foo):
self._decorate_foo=decorate_foo
def foo(self):
print("decorator")
self._decorate_foo()
foo_decorator=decorator(foo)
foo_decorator.foo()
原理也是一样,decorator接受foo参数,并在init构造,并在foo方法里调用了被装饰函数并加强.
其他还有函数装饰类,类装饰类的实现,这里就不一一赘述,以后再讲(其实我也还没研究到)