Python Decorator的一些细节

2016/3/31 19:14 下午 posted in  Python

装饰器函数并不是在被修饰函数调用的时候才执行,而是修饰语句所在的代码块被执行的时候执行。

而且当一个文件(模块)被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.