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

包括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

就谈个py 的装饰器 decorator相关推荐

  1. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())

    #py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...

  2. python装饰器-理解Python装饰器(Decorator)

    理解Python装饰器(Decorator) Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程. 想要理解Python中的装饰器,不得不先理解闭包(clo ...

  3. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  4. [react] 装饰器(Decorator)在React中有什么应用?

    [react] 装饰器(Decorator)在React中有什么应用? connect.withRouter,等类似的高阶组件都可以用装饰器来使用 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放 ...

  5. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator

    建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看. 猿人学python之我的学习笔记分享:如何使用装饰器 @decorator 上面代码中使用装饰器的方法看起来有点复 ...

  6. 装饰器Decorator(函数的装饰)

    一.LEGB函数作用域的优先级和解析 函数是function的一个对象,被调用完后内部变量就会被回收,被引用的除外(例如return的变量) 1.   local :函数内部作用域 2.  enclo ...

  7. python描述器descriptor_python装饰器decorator、描述器descriptor

    背景 image.png 装饰器decorator 返回值为另一函数的函数,通常使用 @wrapper语法. 装饰器的常见例子包括 装饰器语法只是一种语法快捷方式,以下两个函数定义在语义上完全等价: ...

  8. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  9. Python的装饰器decorator

    Python的装饰器decorator 作者:王大为 时间:2016-10-19 一.装饰器的本质 本质:装饰器本身就是一个函数,高阶函数+嵌套函数==>装饰器 原则: * 1.不能修改被装饰函 ...

最新文章

  1. java 画笔跟swing组件_java组件及事件处理(简单基础的界面操作)1
  2. linux下用u盘安装xp系统安装教程,全新Linux笔记本电脑用U盘装Win7/XP系统教程
  3. Linux: shell命令 eval (有图有代码有真相!!!)
  4. Java volatile关键字
  5. maven学习(2)
  6. 20190817:(leetcode习题)旋转图像
  7. 【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
  8. 如歌将两个数组合并_将数组数据拆分后再合并,作为字典的键,实现多条件数据汇总...
  9. 阿里舆情︱舆情热词分析架构简述(Demo学习)
  10. git安装后设置用户名和密码
  11. Mars说光场(5)— 光场在三维人脸建模中的应用
  12. 固态硬盘故障检测_固态硬盘有坏道怎么办(ssd坏块检测工具)
  13. 开源微信小程序源码+小程序游戏代码附搭建框架教程
  14. word打开文档很久很慢_打开office非常慢怎么回事_电脑打开word文件很慢怎么办
  15. 2014 抢票工具 纯java
  16. uni-app实现支付及项目打包上传
  17. Lambda与Stream流
  18. 常用sql语句(备忘)
  19. CAD中怎么识别标高范围?CAD标高范围识别技巧
  20. 摄影基础之---景深

热门文章

  1. Android之提交数据到服务端方法简单封装
  2. 简短总结一下C#里跨线程更新UI
  3. HIT Software Construction Review Notes(0-1 Introduction to the Course)
  4. JavaScript学习(二十三)—scrollTop练习
  5. 定时休眠 linux,linux系统编程手册 定时器和休眠
  6. 跟女朋友约会一般都干些什么?
  7. 65寸的液晶电视是挂在墙上好还是放在电视柜上好?
  8. 今天分享一个做自媒体的方法论
  9. 大家对于晚上下班兼职滴滴司机有什么看法?
  10. ios13.5正式版信号怎样?