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 urlopen()函数 示例分享
Jun 12 Python
Python守护进程用法实例分析
Jun 04 Python
八大排序算法的Python实现
Jan 28 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
Python键盘输入转换为列表的实例
Jun 23 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
基于Python解密仿射密码
Oct 21 Python
python处理RSTP视频流过程解析
Jan 11 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 Python
Pytest中skip和skipif的具体使用方法
Jun 30 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
中国第一家无线电行
2021/03/01 无线电
PHP5 面向对象程序设计
2008/02/13 PHP
PHP 递归效率分析
2009/11/24 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
Extjs中常用表单介绍与应用
2010/06/07 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
通过实例学习Python Excel操作
2020/01/06 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
iPython pylab模式启动方式
2020/04/24 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
竞争性谈判邀请书
2014/02/06 职场文书
利群广告词
2014/03/20 职场文书
体育运动口号
2014/06/09 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
接收函
2019/04/22 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
Golang的继承模拟实例
2021/06/30 Golang