zoukankan      html  css  js  c++  java
  • 就谈个py 的装饰器 decorator

    很早很早就知道有这么个 装饰器的东西,叫的非常神秘。

    包括c#  和 java 中都有这个东西,

    c#中叫做attribut 特性,java中叫做Annotation 注解,在偷偷学习c#教程的时候,我承认我 看了盗版的视频,上边的讲师一带而过,说过这个东西,所以我觉得这个东西很是高达上,这里不说这两个语言,就单说python

    python中实现这个 很简单,当然如果支持这种语法的话,方式是一样的。

    很多程序员就喜欢把简单的东西弄复杂了,例如我,说了 这么一大堆,还没到正题,只是我要讲起来这个东西太简单,。

    我想弄清楚了 几个问题在谈这个东西就比较简单了。

    1、装饰器和被装饰的函数

    2、装饰器的参数,被装饰函数的参数

    3、被装饰函数的返回值

    4、装饰器的参数

    5、装饰器的返回值

    有条例的解释一下这几个问题:

     1 def task_log(task):
     2     print(task)
     3     def decorator(*a, **k):
     4         print(a)
     5         print(k)
     6         return task(*a, **k)
     7     return decorator
     8 
     9 @task_log
    10 def test(a):
    11     print(a)
    12     return a

    很明显

    1、task_log这是个装饰器,test是个被装饰的函数

    2、装饰器的参数是task这个函数,被装饰的参数是a

    3、被装饰的函数返回值是a,装饰器返回了一个decorator这个函数

    调用过程有点小复杂,不过也不是很难理解,

    1、调用test函数

    2、先调用了装饰器

    3、装饰器返回了这个函数的副本

    4、实际中调用了这个副本

    5、在副本中我们有调用了这个函数

    6、一切完事大吉。好像 实现了一个了不起的过程。

    这里是py 的装饰器,其他两种语言基本上一样,所以要求在 attribute中或者Annotation 中实现 invoke 这个方法,或者一个接口,等待程序去调用,本质上还是需要一个在这个类或者方法中实现原函数的调用,当然不对之处还请斧正。

    不过话又说到py中:

    装饰器的执行顺序

    最后给出一个 有参数的版本

    1 def task_log_para(para):
    2     print(para)
    3     def wrapping(task):
    4         def decorator(*a,**k):
    5             print(a)
    6             print(k)
    7             return task(*a,**k)
    8         return decorator
    9     return wrapping

    课后思考

    1、装饰器的参数

    2、装饰器的返回值

    3、装饰器的执行顺序

    另附,除了装饰器可以得到参数以外,还可以为被修饰的函数传递参数,当然是个神奇的事情,enjoy your code~!

  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/bufubaoni/p/5887479.html
Copyright © 2011-2022 走看看