装饰器可以理解为是一个控制过程,这个控制过程需要函数作为参数。一个函数加了控制过程之后,这个函数执行前后控制过程都能够做一些处理。有点类似于java里面的aop。
为了方便理解,先用类来创建一个装饰器。
代码语言:javascript复制class my_decorator(object):
def __init__(self, f):
print("进入到装饰器 __init__()")
f()
def __call__(self):
print("进入装饰器 __call__()")
@my_decorator
def myFunction():
print("进入函数")
myFunction()
输出:
进入到装饰器 __init__()
进入函数
进入装饰器 __call__()
一个类要想被用来做装饰器,必须是callable,可被调用的。而类想要做到可被调用就需要实现__call__方法。
怎么去理解这个装饰器执行过程,myfunction函数加了装饰器后,执行myFunction()等价于下面的代码:
代码语言:javascript复制my_decorator = my_decorator(myFunction)
my_decorator()
也就是加了装饰器的函数在执行时,实际上是先用函数作为参数去初始化这个类得到类实例,然后再执行类实例。
上面的是一个简单的装饰器案例,如果想给函数传递参数或者给装饰器本身传递参数改怎么做呢?