装饰器函数并不是在被修饰函数调用的时候才执行,而是修饰语句所在的代码块被执行的时候执行。
而且当一个文件(模块)被import的时候,文件内的所有装饰器就会被激活执行。因为装饰器语句相当于文件中的普通语句,而非函数声明或者类声明的一部分。
用以下代码方便理解:
# sample.py
def decorator_function(func):
print "executing the decorator."
def wrapper(*args, **kwargs):
print "decorated function is executing."
return func(*args, **kwargs)
return wrapper
print "this python file is executing."
@decorator_function
def test_function(sth):
print "blablabla"+sth
test_function("yeah")
而当我们对一个类里面的普通函数使用修饰符进行修饰的时候,然后我们正常调用这一函数(通过实例化的对象调用),会报错提示这一函数变成了unbound method,缺少了类中函数默认的首参数self。这一问题是由于经过装饰器修饰的函数,实际上是被传递到了装饰器函数中,在这个装饰器函数中被独立调用的,而非被其原先所在的类对象调用。因此在这个装饰器函数中,没有其原来所在的类来对它进行调用,导致提示unbound method.