Python中的装饰器是通过利用了函数特性的闭包实现的,所以在讲装饰器之前,我们需要先了解函数特性,以及闭包是怎么利用了函数特性的

① 函数特性

python中的函数特性总的来说有以下四点:

1. 函数作为变量传递

def add(x):

return x + 1

a = add # 作为变量

说明:函数如果不加括号,是不会执行的,代表的是一个函数对象,它是可以作为变量来传递

2.函数作为参数传递

def add(x):

return x + 1

def execute(f):

return f(3)

execute(add) # 作为参数

说明:一个函数可以接受另一个函数对象作为自己的参数,并对函数对象进行处理

3.函数作为返回值

def add(x):

return x + 1

def get_add():

return add # 作为返回值

说明:一个函数的返回值可以是另一个函数对象

4.函数嵌套及跨域访问

def outer():

x = 1

def inner():

print(x) # 被嵌套函数inner内部的x变量可以到封装域去获取

inner()

outer()

说明:一个函数(主函数)内部是可以嵌套另一个函数(子函数)的,比如outer函数从内部嵌套了inner。一个函数本地域没有的变量,是可以跨到它的封装域(主函数与子函数之间的范围)去寻找的

② 闭包的实现

python中的装饰器是通过闭包实现的,简单地讲,闭包就是引用了外部变量的内部函数,而闭包的实现正是利用了以上函数特性,下面我们来看看闭包是如何实现的:

def outer(x):

def inner(): # 函数嵌套

return x # 跨域访问,引用了外部变量x

return inner # 函数作为返回值

closure = outer('外部变量') # 函数作为变量赋给closure

print(closure()) # 执行闭包

执行结果:

外部变量

说明:我们分析下这个流程,outer接收到'外部变量',传给inner,作为它return的参数,最后outer返回inner函数,返回的inner函数作为变量传递给closure,最后执行closure这个函数对象,实际上是执行了inner这个函数,返回了 '外部变量',这样就实现了一个简单的闭包

我们发现上面的闭包例子只用到了之前说的其中3个函数特性,函数作为参数 这个特性好像并没用上,别急,我们一步步来,试想一下,outer的参数x是不是也可以是一个函数对象?

下面我们来改写一下实现闭包的代码:

def func():

return '函数func'

def outer(x):

def inner(): # 函数嵌套

return '戴了inner牌帽子的 ' + x() # 跨域访问,引用了外部变量x

return inner # 函数作为返回值

closure = outer(func) # 函数func作为outer的参数;函数作为变量赋给closure

print(func()) # 执行原始函数

print(closure()) # 执行闭包

执行结果:

函数func

戴了inner牌帽子的 函数func

说明:我们看到打印的结果, 从 func() 到 closure(),我们是不是感觉函数func被装饰了一番,变成了closure,具体是怎么装饰的呢?

划重点来了!!!!!!!!!!!

我们看到closure实际上是outer(func),func作为参数传进outer,outer的子函数inner对func返回的结果进行了一番装饰,返回了一个装饰后的结果,最后outer返回inner,可以说inner就是装饰后的func,这就是一个函数被装饰的过程,重点在于执行 outer(func) 这个步骤

③ 装饰器语法糖 @

python给我们提供了语法糖 @,我们想执行 outer(func) 的时候,只需要把outer函数@到func函数的上面就可以了

具体实现如下:

def outer(x):

def inner():

return '戴了inner牌帽子的 ' + x()

return inner

@outer

def func():

return '函数func'

print(func())

执行结果:

戴了inner牌帽子的 函数func

说明:我们看到打印的结果跟我们执行closure()的结果是一样的,也就说明 加了outer装饰器的func 等价于 outer(func),所以我们很清楚地知道装饰器@的作用是什么了,就是拿来把被装饰的函数作为参数传递到装饰器函数里面加工的,最后执行被装饰函数的时候,就相当于执行了一个加工后的函数。

以上就是python中装饰器的诞全生过程......ChrisYZX:Python装饰器的诞生过程​zhuanlan.zhihu.com

python 装饰器实现事件绑定_Python装饰器是怎么实现的?相关推荐

  1. python 装饰器实现事件绑定_Python装饰器实现几类验证功能做法实例

    最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器. 比如下面这种 调 ...

  2. python装饰器setter实现原理_python装饰器、描述符模拟源码实现

    概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识.装饰器应用.装饰器延申 装饰理基础 ...

  3. python装饰器作用和功能_python装饰器大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局 ...

  4. python描述器做权限控制_Python装饰器14-描述器

    描述器 这是Python一个重要的概念,英文名:Descriptor descriptor是对象的一个属性,只不过它存在于类的dict中并且有特殊方法get(可能还有set和__delete)而具有一 ...

  5. python装饰器作用和功能_Python装饰器原理与用法分析

    这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念.原理.使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python装饰器原理与用法.分享给大 ...

  6. python装饰器的通俗理解_python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  7. python装饰器模式带参数_python 装饰器模式 我的理解

    python和javascript类似, 可以把函数当作函数的返回值, 比如 def func(f): def subfunc(): print 'subfunc' return subfunc此外f ...

  8. python装饰器有几种_Python装饰器使用你可能不知道的几种姿势

    前言 在Python中,装饰器是一种十分强大并且好用的语法,一些重复的代码使用装饰器语法的话能够使代码更容易理解及阅读. 因此在这里简单总结了一下Python中装饰器的几种用法以及需要注意的事情. 一 ...

  9. python装饰器作用噜咕_Python装饰器是什么?有什么价值?

    装饰器就是把一个猴子,塞入炼丹炉,然后就出来一个还是会吃桃子,但有火眼金睛的猴子:还是原来的猴子,但多了特效技能. 下面我们以下4个方面介绍Python的装饰器:什么是装饰器? 为什么Python要引 ...

最新文章

  1. 基于matlab的对流层散射信道特性仿真,对流层散射信道建模和FPGA实现
  2. GitHub教程学习笔记3---分支管理
  3. python写软件-Python是怎么编写软件的?
  4. VS中的 MD/MT设置 【转】
  5. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建
  6. 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别
  7. [******] 树问题:普通二叉树的创建与遍历
  8. java 静态绑定_java的动态绑定和静态绑定
  9. 容灾技术中的数据一致性保障
  10. Q145: 三次曲线对比及其矩阵表示(Bezier, B-Spline, Hermite, Catmull-Rom)
  11. WEB标准有什么好处?
  12. 首次揭秘!字节跳动基础架构技术迭代演进之路
  13. 计算机屏幕重影红色,Win7/Win10系统玩游戏屏幕出现红蓝重影解决方法
  14. 矩阵直接分解法matlab,矩阵直接三角分解法
  15. 防止短信接口验证码被恶意点击
  16. 计算机上机考试自我检查800字,学生检讨书800字反省自己【三篇】
  17. 【历史上的今天】9 月 28 日:“超级计算机之父”诞生;三星推出移动支付;LibreOffice 发布
  18. 出版一本书可以赚多少钱_今年出版5本书
  19. 高数曲线,心形线,摆线,等曲线大全
  20. win10亮度_Win10系统运行游戏或大型软件的优化设置教程

热门文章

  1. Walking on the path of Redis --- Redis configuration
  2. php使用strstr函数 ,判断字符串A中是否含有字符串B
  3. 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)
  4. 卫星导航技术的源起很有戏剧性
  5. 多线程编程:return、pthread_exit()、exit()函数区别
  6. “AlphaGo之父”获最新一届ACM计算奖
  7. java 链表 传递_java 链表 传递过程中的问题
  8. mysql二维转一维_二维数组转为一维数组
  9. Collection接口详解
  10. 026_jdbc-mysql-PrepareStatement解决sql注入