Python装饰器(decorators)
Python装饰器(decorators) 装饰器(decorators)是Python强大的功能之一,语法上就支持(@符号)使用起来更方便,不需要用OOP的设计模式实现。装饰器其实就是个返回函数的函数(类),但可以有很多的玩法,下面将一一介绍。 函数(Functions) 讲装饰器之前,先回顾下一些函数的基础知识,装饰器就是这些简单功能的组合 函数接收函数作为参数 python中定义一个函数很简单如下 >>> def foo(): ... pass ... >>> foo <function foo at 0x1054157a0> >>> bar = foo >>> bar <function foo at 0x1054157a0> 定义了foo函数,而bar是对foo的引用,这很简单 因为python中一切皆对象,函数也是对象,一个函数也可以使用函数作为参数传入,和传其他对象一样(字符串、数字、列表 …) >>> def foo(): ... print("hello world") ... ... >>> def bar(f): ... print(f"call {f.__name__}") ... f() ... ... >>> bar(foo) call foo hello world bar函数就接收foo函数作为参数,内部执行foo函数。 函数内部定义函数 也可以在函数内部定义一个新的函数 >>> def foo(): ... def bar(): ... print("inner func") ... bar() ... ... >>> foo() inner func >>> bar() Traceback (most recent call last): File "<input>", line 1, in <module> bar() NameError: name 'bar' is not defined foo函数中定义了bar函数,定义内部函数和定义在外面的函数没有任何的区别,只是它的作用域只能在foo函数内部,外部是无法应用bar的 函数返回函数 更高级的函数甚至可以返回一个函数作为返回结果 >>> def foo(): ... def bar(): ... return "hello world" ... return bar ... >>> foo <function foo at 0x10c063440> >>> foo() <function foo.<locals>.bar at 0x10baea170> >>> foo()() 'hello world' 注意我们这一次内部不再调用bar()而是return bar,说明foo函数返回一个内部函数的引用 可以看到调用foo()函数返回了内部定义的bar函数(<function foo.<locals>.bar at 0x10baea170>)但没有执行调用,再次调用则会被执行。 ...