• 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函数里面的,最后,我们输出函数名验证一下。

    这就是@修饰符的作用了,还不会飞的小菜鸡,文章有错误欢迎大佬随时指正。
    -----------------------------------------努力,不只是一种习惯,更是一种品质。
  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/liangshian/p/11200476.html
Copyright © 2020-2023  润新知