Python高级--闭包与装饰器
前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能。如权限认证。
一、如何定义闭包
1.闭包就是两个嵌套的函数,外层函数返回内层函数的引用,而且外层函数必须携带参数!为什么外层函数必须要有参数呢?可以思考一下!
基本格式如下:
def outer_fun(func): def inner_fun(): pass return inner_fun
2.与普通函数的区别:
闭包的外层函数的变量可以在内存中保存着,有点像类;而普通函数一旦执行完,那么就要回收内存。
3.万能闭包
def outer_func(func): def inner_func(*args, **kwargs): func(*args, **kwargs) return inner_func
二、装饰器
1.什么是装饰器:@闭包的外层函数名
2.装饰器的作用:不修改被装饰函数的功能外,再通过闭包的方式添加额外的功能!
3.基本结构:
def outer_func(func): def inner_func(): pass return inner_func @outer_func # test = outer_func(test) def test(): pass
重点:上述代码的第七行和第八行是重点,看到这个语法糖要想到其本质: test = outer_func(test)
4.结论:
(1). 装饰前的test函数和闭包外层函数的func是一样的;
(2). 装饰后的test函数是闭包内层函数的引用,也就是说此时test指向了inner_func函数体;
(3). 装饰器一般不改变原先函数的行为。
5.装饰器的一个小问题
与其说是装饰器的问题,不如说是闭包的问题!
一个函数被装饰之后,它的函数名会发生变化,变成了闭包的内层函数名。那该怎么解决这个问题呢?
使用funtools.wraps()这个装饰器就可以完美解决这个问题了,因为这个装饰器会保留被装饰函数的一些基本信息。
import functools def outer_func(func): # 使用这个装饰器,可以保留被装饰函数的一些基本信息,如名称不变 @functools.wraps(func) def inner_func(*args, **kwargs): func(*args, **kwargs) # inner_func.__name__ = func.__name__ return inner_func @outer_func def test(*args, **kwargs): print('%s 正在运行。。。。' % test.__name__) test()
三、装饰器内存图解
1.一个装饰器装饰一个函数的内存图解:
2.两个装饰器装饰一个函数的内存图解
四、装饰器传参数
1.结构:由三层函数构成的,即用一个函数把闭包给封装起来,这个函数必须带有参数!
最外层函数(set_args)返回闭包的外层函数的引用;
闭包的外层函数(outer_fun)还是返回内层函数的引用。
def set_args(args): def outer_fun(func): def inner_fun(*args, **kwargs): func(*args, **kwargs) return inner_func return outer_fun
2.运行流程:
@set_args(') def test(): print('test') test()
(1).先执行@右边的函数,即先执行set_args('123'),
(2).执行完set_args()后返回outer_fun的引用,此时就是test = outer_fun(test)这个熟悉的语法了,
(3).接下来就执行被装饰的函数了。
Python高级--闭包与装饰器的更多相关文章
- Python函数编程——闭包和装饰器
Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
- python之闭包与装饰器
python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...
- Python之闭包and装饰器
闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...
- 关于python的闭包与装饰器的实验
首先看闭包,在嵌套函数内添加返回值,可以通过外部函数读取内部函数信息 #encoding=utf-8 #闭包应用 #先定义闭包函数,并使用 def outer(func): def inner(): ...
- python中闭包和装饰器
前言: 编程语言发展的过程中,我们为了提高代码利用率,发明了函数式编程.函数将代码封装起来,我们需要用到此功能函数的时候,调用一下就可以了.但是使用的过程中,也遇到了一些问题,比如函数实现的功能不够, ...
- Python作用域-->闭包函数-->装饰器
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...
- python的闭包与装饰器
原文发表在我的博客主页,转载请注明出处 前言 如果把python当作脚本语言,每次就是写个几十行上百行来处理数据的话,装饰器也许不是很必要,但是如果要开发一个大型系统,装饰器是躲不开的,最开始体会ry ...
- Python的闭包和装饰器
什么是闭包 python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用. 闭包的作用就是让一个变量能够常驻内存. def ...
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
随机推荐
- Java基础——工厂模式
通过学习,一句话概括Java工厂模式的特点——通过建立一个工厂来创建对象,不必关心构造对象实例能不能被实例化啊等诸多细节和复杂过程. 工厂模式呢?就像我们从劳动密集型社会转型到技术密集型社会.打个比方 ...
- Spring是什么 包括SpringBean SpringMVC SpringBoot SpringCloud
什么是Spring:spring是个开源框架,spring mvc是基于spring的一个mvc框架,spring boot是基于spring4的条件注册的一套快速开发整合包. Spring两大特征: ...
- SpringMVC+Spring+MyBatis 整合与图片上传简单示例
一.思路: (一) Dao层: 1. SqlMapConfig.xml,空文件即可.需要文件头.2. applicationContext_dao.xml. a) 数据库连接池b) SqlSessio ...
- gulp前端自动化环境搭建详解
1.安装 nodejs Grunt和所有grunt插件都是基于nodejs来运行的, https://nodejs.org/ 安装完成之后在终端 node -v 查看安装版本 npm -v 查看np ...
- 微信小程序上传图片(前端+PHP后端)
一.wxml文件 <text>上传图片</text> <view> <button bindtap="uploadimg">点击选择 ...
- Intellij IDEA 使用GitHub+Git
1.配置Git路径 打开Settings(File-->Settings) --> 在搜索栏内输入git,回车跳转到Git配置页面 --> 将git的运行路径填入Path to Gi ...
- 基于react的标准form+table页面的请求流程图
componentDidMount直接走handleSearch而不走loadData,是为了当form有默认初始值的时候也能适用! --------------------2018.2.7新增--- ...
- 安装cuda8.0时无法安装.net Framework 4.0 错误的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 在win7 64位旗舰版(带sp1)上安装cuda时到安装Microsoft.NET Framework4.0,一直停 ...
- OSGI企业应用开发(五)使用Blueprint整合Spring框架(二)
上篇文章中,我们开发了一个自定义的Bundle,接着从网络中下载到Spring和Blueprint的Bundle,然后复制到DynamicRuntime项目下. 需要注意的是,这些Bundle并不能在 ...
- objc与鸭子对象(上)
这是<objc与鸭子对象>的上半部分,<objc与鸭子对象(下)>中介绍了鸭子类型的进阶用法.依赖注入以及demo. 我是前言 鸭子类型(Duck Type)即:“当看到一只鸟 ...