装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
装饰器特性
装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。这通常是在导入时(即 Python 加载模块时),如下代码:1234567891011121314151617181920212223242526registry = []def register(func): print('running register(%s)' % func) registry.append(func) return func@registerdef f1(): print('running f1()')@registerdef f2(): print('running f2()')def f3(): print('running f3()')def main(): print('running main()') print('registry ->', registry)f1()f2()f3()if __name__=='__main__': main()
运行效果:
running register(
running register(
running main()
(‘registry ->’, [
running f1()
running f2()
running f3()
这里主要想强调,函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。这突出了 Python 程序员所说的导入时和运行时之间的区别。
装饰器案例
|
|
|
|
|
|