• python的@修饰符


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

    一个简单的栗子:

     1 def funA(fn):
     2     print('A')    # 输出A
     3     fn() # 执行传入的fn参数  输出B
     4     return 'fkit'  # 返回给funB
     5 '''
     6 下面装饰效果相当于:funA(funB),
     7 funB将会替换(装饰)成该语句的返回值;
     8 由于funA()函数返回fkit,因此funB就是fkit
     9 '''
    10 @funA
    11 def funB():
    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 def my_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 def test():
    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函数里面的,最后,我们输出函数名验证一下。

    这就是@修饰符的作用了,还不会飞的小菜鸡,文章有错误欢迎大佬随时指正。
    -----------------------------------------努力,不只是一种习惯,更是一种品质。
  • 相关阅读:
    BZOJ4644 经典傻逼题 (线段树分治+可撤销线性基+Xor)
    CF678E Another Sith Tournament(思维+dp)
    HDU 6511
    HDU6513 Reverse It(容斥+Cnk)
    一篇最浅显易懂的Splay讲解(试问谁能比我的更易懂
    [CTSC2016]时空旅行 (线段树分治+凸壳
    关于dsu on tree 和一些例题 CF 741 D
    关于区间开根号+区间询问
    [FJOI2015]火星商店问题 --线段树分治+可持久化trie
    线段树 关于pushup的技巧
  • 原文地址:https://www.cnblogs.com/liangshian/p/11200476.html
Copyright © 2020-2023  润新知