1.装饰器
1.1装饰器定义
函数装饰器允许在源码中“标记”函数,以某种方式增强函数的行为。
装饰器是一种可调用对象,其参数是另一个函数(被装饰的函数)。
装饰器可能会对被装饰的函数做些处理,然后返回函数,或者把函数替换成另一个函数或可调用对象。
语法如下:
装饰器使用符号@
假如有一个名为decorate的装饰器:
@decorate
def target():
print('running target()')
那么上述代码的效果和下述写法一样:
def target():
print('running target()')
target = decorate(target)
1.2例子:装饰器通常会把一个函数替换成另一个函数
#定义一个装饰器
def deco(func):
#定义一个内部函数
def inner():
print('running inner()')
#返回内部函数
return inner
#根据定义等效于 target = deco(target)
@deco
def target():
print('running target()')
#等效于deco(target)()
#deco(target)返回的是inner()函数的引用
#最终调用的是inner()
target()
running inner()
#查看下target的引用
target
<function __main__.deco.<locals>.inner()>
可以看见target指向了deco函数的内部函数inner()
1.3装饰器执行
装饰器在被装饰的函数定义之后立即执行。在导入模块时(import)。
下面用一个注册用户的例子说明
#定义一个列表用来存储用户函数的引用
user_list = []
#定义装饰器函数此函式功能是增强被装饰的函数做一些额外操作,(记录被装饰函数的引用,并返回原函数)
def reg_user(func):
print(f'running reg user({func})')
user_list.append(func)
return func
@reg_user
def user1():
print('running user1()')
def user2():
print('running user2()')
@reg_user
def user3():
print('running user3()')
def main():
print('running main()')
print('user_list ->', user_list)
user1()
user2()
user3()
if __name__ == '__main__':
main()
running reg user(<function user1 at 0x000001C9254F6AC0>)
running reg user(<function user3 at 0x000001C9254F6D40>)
running main()
user_list -> [<function user1 at 0x000001C9254F6AC0>, <function user3 at 0x000001C9254F6D40>]
running user1()
running user2()
running user3()
1.4总结
- 装饰器是一个函数或其它可调用对象。
- 装饰器可以把被装饰的函数替换成别的函数。
- 装饰器在加载模块(import)时立即执行。
关注我了解更多 微信公众号 : 搏哥聊技术