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之从格式化表达式到方法
Sep 28 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
python的文件操作方法汇总
Nov 10 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
Golang GBK转UTF-8的例子
Aug 26 Python
基于python实现可视化生成二维码工具
Jul 08 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
pip install命令安装扩展库整理
Mar 02 Python
Python3接口性能测试实例代码
Jun 20 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将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
jQuery $.each的用法说明
2010/03/22 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
使用django实现一个代码发布系统
2019/07/18 Python
python3 深浅copy对比详解
2019/08/12 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
医药工作者的求职信范文
2013/09/21 职场文书
企业办公室岗位职责
2014/03/12 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
作弊检讨书
2015/01/27 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书