python之闭包、装饰器
一、学习Python的时候发现函数内部,还可以写函数,并且可以返回函数。觉得挺新奇的,主要是在探索装饰器(有点像Java的注解)的时候,发现这个理解还是很主要的,所以这里记录一下。
二、闭包
1)首先看一部分代码
def sum1(x):
def sum2(y):
print x + y
return sum2
2)理解:
a、外部传入一个参数
b、在sum1内部声明了一个sum2函数,并且需要传参数,但是没有调用
c、然后返回了sum2函数
3)执行:
sum2 = sum1(10)
sum2(2) //12
sum2(4) //14
4)闭包:在第一次调用完成后,按理说x应该用结束了,但是内部函数还需要使用。后续计算直接使用x的变量值得出x+y的结果。
简单一点:就是外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数
三、装饰器
1)首先还是看一段代码和执行结果
def w1(fn):
print "w1"
def inner():
print "in1"
fn()
return inner def w2(fn):
print "w2"
def inner():
print "in2"
fn()
return inner @w1
@w2
def f():
print "f" f()
执行结果:
2)说明
装饰器:这个看着其实有点像AOP的过程,在spring中存在通过AOP的方式来进行切面,然后加入其它逻辑,比如:事务等。这里的修饰器也就是,在原来的函数基础上,做了更多地工作用来包装原本函数执行结果。
注意:Python中的装饰器和spring中的AOP还是存在差别,就是装饰器是嵌套装饰的,AOP是一层一层切面的。(感觉也差不多)
3)理解
a、f()通过@w2装饰,即为:w2f = w2(f()).
注意:这里返回的是w2中的inner,是以第一次包装后的函数。
b、通过第二次包装@w1,然后返回w1w2f = w1(w2f)
注意:这里包装的是@w2包装后的函数
c、执行过程:包装顺序,从下往上。
然后执行函数,执行w1w2f-->w2f-->f
四、通用装饰器
不带参数装饰器:
def func(function_name): def func_in(*args, **kwargs):
return function_name(*args, **kwargs) return func_in
带参数的装饰器:
def func_arg(*args1, **kwargs1): def func(function_name): def func_in(*args2, **kwargs2): return function_name(*args2, **kwargs2) return func_in return func
类装饰器:
class ClassArg:
def __init__(self, func):
self.func = func def __call__(self, *args, **kwargs):
self.func(*args, **kwargs)
python之闭包、装饰器的更多相关文章
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- python高级-闭包-装饰器
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- python之闭包+装饰器
闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- 第二篇:python高级之装饰器
python高级之装饰器 python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- python学习之装饰器-
python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...
随机推荐
- Tosca 添加 modules,添加Library,引用重复步骤
#增加modules modules模块式基础,好像一切都得从modules开始,想下面这样一个简单的login module就建好了 把这个module login 拖到具体的test case上 ...
- flutter 中的搜索条实现
import 'package:flutter/material.dart'; import 'package:flutter_app/SearchBarDemo.dart'; void main() ...
- Typescript 介绍和安装编译
一. Typescript 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 2. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.Typ ...
- 查看Oracle中是否有锁表
转: 查看Oracle中是否有锁表 2018-04-23 17:59 alapha 阅读(19450) 评论(0) 编辑 收藏 一.用dba用户登录,或者将用户赋权为DBA用户 命令: su - or ...
- ROS学习笔记(二)
===================================================== QT工具箱sudo apt-get install ros-kinetic-rqtsudo ...
- Spring Cloud微服务安全实战- 2-1 环境安装
下面这些.后续随着讲课逐步再去安装. 2019年1月开始 jdk是收费的 找jdk最后一个免费版本 8u192这是jdk1.8最后的一个免费版本 STS spring提供的ide可以方便的开发spri ...
- 将PCM格式存储成WAV格式文件
将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...
- Flink 在IDEA执行时的webui
不过Flink IDEA中执行的webui 需要 flink-runtime-web 包的支持 pom 如下: <dependency> <groupId>org.apache ...
- Flink 异步IO访问外部数据(mysql篇)
接上篇:[翻译]Flink 异步I / O访问外部数据 最近看了大佬的博客,突然想起Async I/O方式是Blink 推给社区的一大重要功能,可以使用异步的方式获取外部数据,想着自己实现以下,项目上 ...
- while死循环
while死循环放入主线程要注意,如果处理不当可能引起界面假死,如果界面假死,可以放入子线程中(如果每个循环处理时间现对于CPU很短,则建议在本次循环结束的尾部加入Sleep以释放对CPU的占用) C ...