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连接mysql并提交mysql事务示例
Mar 05 Python
python输出当前目录下index.html文件路径的方法
Apr 28 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
利用python实现数据分析
Jan 11 Python
Python处理Excel文件实例代码
Jun 20 Python
python脚本替换指定行实现步骤
Jul 11 Python
python程序封装为win32服务的方法
Mar 07 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Django自关联实现多级联动查询实例
May 19 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
win10安装python3.6的常见问题
2020/07/01 Python
python 简单的调用有道翻译
2020/11/25 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
大学生护理专业自荐信
2013/10/03 职场文书
小学教师的自我评价范例
2013/10/31 职场文书
餐厅筹备计划书
2014/04/25 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
中学教代会开幕词
2016/03/04 职场文书
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers