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语言编写电脑时间自动同步小工具
Mar 08 Python
全面解读Python Web开发框架Django
Jun 30 Python
Python用模块pytz来转换时区
Aug 19 Python
Python算术运算符实例详解
May 31 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
python web框架 django wsgi原理解析
Aug 20 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
python实现IOU计算案例
Apr 12 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
Django 实现图片上传和下载功能
Dec 31 Python
什么是Python装饰器?如何定义和使用?
Apr 11 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读取30天之内的根据算法排序的代码
2008/04/06 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Django日志模块logging的配置详解
2017/02/14 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
python 将md5转为16字节的方法
2018/05/29 Python
深入理解Django-Signals信号量
2019/02/19 Python
python实现合并两个排序的链表
2019/03/03 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
python构造函数init实例方法解析
2020/01/19 Python
python绘制玫瑰的实现代码
2020/03/02 Python
Python实现AI换脸功能
2020/04/10 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
什么是设计模式
2012/06/17 面试题
生产部主管岗位职责
2014/01/06 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
怎样写观后感
2015/06/19 职场文书