python @修饰符_python的@修饰符

‘@’引用已有的函数,对下面的函数进行修饰。引用函数必须放在修饰函数的上面,引用函数的返回值,返回给被修饰的函数

一个简单的栗子:

1 deffunA(fn):2 print('A')    # 输出A3 fn() #执行传入的fn参数  输出B

4 return 'fkit'  # 返回给funB

5 '''

6 下面装饰效果相当于:funA(funB),7 funB将会替换(装饰)成该语句的返回值;8 由于funA()函数返回fkit,因此funB就是fkit9 '''

10 @funA11 deffunB():12 print('B')13 print(funB) #此时再运行funB函数输出的是fkit

这里funA是引用的函数,funB是被修饰的函数。@修饰符的功能就是把funB当做参数传递给funA,然后把funA的返回值返回到funB

这意味着程序要完成两步操作:

将 funB 作为 funA() 的参数,也就是上面代码中 @funA 相当于执行 funA(funB)。

将 funB 替换成上一步执行的结果,funA() 执行完成后返回 fkit,因此 funB 就不再是函数,而是被替换成一个字符串。

输出如下:

A

B

Fkit

当然,也可以返回一个函数,看下面这个栗子:

1 defmy_decorator(func):2 def wrapper(): #暂时跳过这个函数

3 '''decorator'''

4 print('Decorated function...')5 print('123')6 return wrapper #把wrapper函数返回给test

7

8

9 @my_decorator #decorator(test())

10 deftest():11 """Testword"""

12 print('Test function')13

14

15 test()16 print("函数名:%s" % test.__name__)

输出如下:

123

Decorated function...

函数名:wrapper

可以看出,最先输出了第五行的‘123’,然后是第四行的‘Decorated function...’,最后是第十六行的函数名,下面捋一下代码的执行顺序:

最先执行了第9行代码,开始运行被引用函数,被引用函数的返回值是里面的嵌套函数wrapper,暂时跳过这个嵌套函数,运行到第5行,此时输出‘123’;运行第六行把内嵌函数返回给test函数,此时@修饰符的作用就算是已经完成了,接下来,代码运行第15行,调用test函数,但此时并没有test里面的

'Test function',二是输出了wrapper里面的'Decorated function...',这就是把函数作为被引用函数返回值的效果,此时的test本质上已经不再是test了,二是被引用函数的返回值wrapper函数,所以输出内容是wrapper函数里面的,最后,我们输出函数名验证一下。

这就是@修饰符的作用了,还不会飞的小菜鸡,文章有错误欢迎大佬随时指正。

-----------------------------------------努力,不只是一种习惯,更是一种品质。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值