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实现程序的单一实例用法分析
Jun 03 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
pygame实现飞机大战
Mar 11 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
对python中的xlsxwriter库简单分析
2018/05/04 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
Python实现异步IO的示例
2020/11/05 Python
如何用python写个模板引擎
2021/01/14 Python
Linux文件系统类型
2012/09/16 面试题
大学生四个方面的自我评价
2013/09/19 职场文书
车工岗位职责
2013/11/26 职场文书
护理专业自荐书
2014/06/04 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
2014企业年终工作总结
2014/12/23 职场文书
个人汇报材料范文
2014/12/30 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL