函数装饰器

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总结

  1. 装饰器是一个函数或其它可调用对象。
  2. 装饰器可以把被装饰的函数替换成别的函数。
  3. 装饰器在加载模块(import)时立即执行。

关注我了解更多 微信公众号 : 搏哥聊技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搏哥聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值