首页 > 代码库 > 就谈个py 的装饰器 decorator

就谈个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_log10 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 decorator9     return wrapping

课后思考

1、装饰器的参数

2、装饰器的返回值

3、装饰器的执行顺序

 

就谈个py 的装饰器 decorator