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~!

  • 相关阅读:
    Django使用Mysql已存在数据表的方法
    ajax加载验证码这样不断刷新的文件无法刷新问题
    flask ajax发送请求返回400
    flask启动找不到路由问题
    Python开发之路
    文件读写的简单应用
    sql 简单查询修改
    kafka 查询 SQL Query
    kafka条件查询excel拼接
    shelve模块
  • 原文地址:https://www.cnblogs.com/bufubaoni/p/5887479.html
Copyright © 2011-2022 走看看