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中的闭包与装饰器

    函数的装饰器可以以某种方式增强函数的功能,如在 Flask 中可使用 @app.route('/') 为视图函数添加路由,是一种十分强大的功能.在表现形式上,函数装饰器为一种嵌套函数,这其中会涉及到闭 ...

  2. python中继承是什么意思_如何理解Python中的继承?python入门

    如何理解Python中的继承?如今,python编程语言深受企业和个人的喜爱.python开发工程师是近年来互联网行业非常热门的职业岗位之一.学习python的人除了零基础的,还有一部分是在职运维.在 ...

  3. python绘图颜色深浅代表数值_画图理解Python的深浅拷贝

    在平常运维工作中,难免会有一些修改服务配置文件的操作,为了安全和可以回滚起见,我们习惯性的会将源配置文件做一个拷贝,这样以来即便配置文件参数被修改错了也没事,可以快速从备份的副本还原回来. 同样,在 ...

  4. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

  5. python如何得出数组里最大_如何理解Python里的字典dict?

    字典dict由键值key-value构成,具有较强的查询检索能力. 基本格式为: dict={key1:value1,key2:value2,......,keyn,valuen } 1.key由数字 ...

  6. python中从小到大排序的函数_深入理解Python中的排序函数

    由于 Python2 和 Python3 中的排序函数略有区别,本文以Python3为主. Python 中的排序函数有 sort , sorted 等,这些适用于哪些排序,具体怎么用,今天就来说一说 ...

  7. python函数可以作为容器对象吗_正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  8. python装饰器由浅入深_由浅入深理解Python装饰器

    前提知识: 1.Python里函数也是一种对象: def shout(word="yes"): return word.capitalize()+"!" pri ...

  9. python装饰器的通俗理解_简单理解Python装饰器

    Python有大量强大又贴心的特性,如果要列个最受欢迎排行榜,那么装饰器绝对会在其中. 刚接触装饰器,会觉得代码不多却难以理解.其实装饰器的语法本身挺简单的,复杂是因为同时混杂了其它的概念.下面我们一 ...

最新文章

  1. postgres 显示变量_postgre 查询时 postgres=# 变成 ! ! 要怎么解决?
  2. Python基础之模块与包
  3. 菜鸟教程 php跨域,PHP Ajax 跨域问题最佳解决方案
  4. mysql分库分区分表怎么做_mysql 分区、分表、分库分表。
  5. Python3 安装PyMySQL
  6. 读书笔记_CLR.via.c#第十六章_数组
  7. .NetCore SkyWalking APM实现服务器监控环境安装及基础使用
  8. Kotlin开发细节
  9. php 验证 e mail,PHP表单验证Name,E-mail,和URL-三体教程在线编辑器
  10. 安装libgl1-mesa-dri:i386重启后黑屏问题解决
  11. python文本处理
  12. n1进入recovery模式_OPPO N1如何进入recovery模式
  13. 最好用的文件上传插件 bootstrap fileInput
  14. 【ASO优化】产品ASO优化的流程分解
  15. 研究生做实验时被炸伤致残!法院判决:驳回高校上诉,赔偿162万!
  16. Contest1389 - 2018年第三阶段个人训练赛第四场. Transit Tree Path(DFS)
  17. 文字转语音软件哪个好?这些软件值得收藏
  18. 如何查看/修改Linux时区和时间
  19. 数据结构(数组)的特点以及优缺点
  20. 优酷海外用户自动显示简体页面方法

热门文章

  1. Nanachi发布:基于 React 的多端小程序转译框架
  2. 妈妈花3万给9岁儿子报编程课 网友:全是忽悠!
  3. 520送你一份WebStorm的主题包,附带使用图文教程
  4. 程序员情人节送这些!
  5. java reducebykey_Spark入门(五)--Spark的reduce和reduceByKey
  6. 数据库 | OMIM (在线人类孟德尔遗传)数据库简介
  7. 颠覆教科书:打破50年来的认知,DNA同义突变会影响蛋白质折叠,进而影响细胞生长...
  8. 复现原文(一):Single-cell RNA sequencing of human kidney(step by step)
  9. 如何解决aText for mac不响应的教程
  10. generating phar.php,Generating