就谈个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~!

原文地址:https://www.cnblogs.com/bufubaoni/p/5887479.html