python中函数总结之装饰器闭包详解


Posted in Python onJune 12, 2016

1、前言

函数也是一个对象,从而可以增加属性,使用句点来表示属性。

如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包。

2、装饰器

装饰器就是包装原来的函数,从而在不需要修改原来代码的基础之上,可以做更多的事情。

装饰器语法如下:

@deco2
@deco1
def func(arg1,arg2...):
  pass

这个表示了有两个装饰器的函数,那么表示的含义为:func = deco2(deco1(func))

无参装饰器语法如下:

@deco
def func():
  pass

表示的含义为func = deco(func)

有参装饰器语法如下:

@deco(deco_args)
def func():
  pass

表示的含义为:func = deco(deco_args)(func)

多个装饰器有的有参数有的没参数,语法如下:

@deco2(arg1,arg2)
@deco1
def func():
  pass

表示的含义为foo = deco2(arg1,arg2)deco1(func)

装饰器实际上就是函数,接受的也是函数对象。

在执行函数之前,可以运行预备代码,也可以在执行代码后做一些清理工作。

看见装饰器的时候,很可能在里面找到一些代码,它定义了某个函数,并在定义内的某处嵌入了对目标函数的调用或者至少一点引用。

3、装饰器作用

装饰器的作用如下:

引入日志;增加计时逻辑来检测性能;给函数加入了事物的能力

以下例子表示为引入了计时的逻辑来检测性能,如下:

#!/usr/bin/env python

from time import ctime,sleep

def tsfunc(func): #装饰器函数接受的是一个函数对象
  def wrappedFunc():
    print '[%s] %s() called' % (ctime(),func.__name__)
    return func() #在这里调用了函数对象,也就是表示装饰器是装饰了原来的函数,从而在原来函数的基础上进行了一些操作
  return wrappedFunc

@tsfunc #装饰器
def foo():
  pass

foo()
sleep(4)

for i in range(2):
  sleep(1)
  foo()

 执行结果如下:

[root@python 420]# python deco.py 
[Tue Apr 19 16:15:01 2016] foo() called
[Tue Apr 19 16:15:06 2016] foo() called
[Tue Apr 19 16:15:07 2016] foo() called

在装饰器函数中,增加了时间戳并且调用了目标函数,装饰器的返回值是一个包装了函数

4、闭包

如果在一个内部函数里,对在外部作用于(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包closure,定义在外部函数内的但由内部函数引用或者使用的变量称之为自由变量。

闭包的主要作用如下:

安装计算;隐藏状态;在函数对象和作用域中随意的切换。

回调就是函数,闭包也是函数,但是能携带一点额外的作用域。

#!/usr/bin/env python

def counter(start_at=0):
  count = [start_at]
  def incr():
    count[0] += 1
    return count[0]
  return incr

count= counter(5)
print count()
print count()

在上面的例子可以看到,函数内部的函数incr引用了外部的变量count,并且每次进行加一,从而这个变量count称之为自由变量。

以上这篇python中函数总结之装饰器闭包详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用7z解压软件备份文件脚本分享
Feb 21 Python
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
Python线程创建和终止实例代码
Jan 20 Python
python验证码识别教程之滑动验证码
Jun 04 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
Python面向对象之类和实例用法分析
Jun 08 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
django为Form生成的label标签添加class方式
May 20 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 #Python
深入理解python中的闭包和装饰器
Jun 12 #Python
Python编码爬坑指南(必看)
Jun 10 #Python
浅析Python中的for 循环
Jun 09 #Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 #Python
Python-嵌套列表list的全面解析
Jun 08 #Python
PYTHON压平嵌套列表的简单实现
Jun 08 #Python
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
python中os操作文件及文件路径实例汇总
2015/01/15 Python
python保存字符串到文件的方法
2015/07/01 Python
python提取字典key列表的方法
2015/07/11 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
Puppeteer使用示例详解
2019/06/20 Python
Python如何调用外部系统命令
2019/08/07 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
德国家具在线:Fashion For Home
2017/03/11 全球购物
大学生创业感言
2014/01/25 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
个人整改方案范文
2014/10/25 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
个人党性分析总结
2015/03/05 职场文书
小学班主任教育随笔
2015/08/15 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB