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基础教程之面向对象的一些概念
Aug 29 Python
跟老齐学Python之集成开发环境(IDE)
Sep 12 Python
Python中的sort()方法使用基础教程
Jan 08 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
使用Python横向合并excel文件的实例
Dec 11 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
python使用selenium实现批量文件下载
Mar 11 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
Python join()函数原理及使用方法
Nov 14 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
深入php处理整数函数的详解
2013/06/09 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
js计算精度问题小结
2013/04/22 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JSONP基础知识详解
2017/03/19 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
详解使用React进行组件库开发
2018/02/06 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
react+redux仿微信聊天界面
2019/06/21 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
python实现的系统实用log类实例
2015/06/30 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Pycharm小白级简单使用教程
2020/01/08 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
美国在线印刷公司:PsPrint
2017/10/12 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
如何写好建议书
2014/03/13 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
个人政治思想总结
2015/03/05 职场文书
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android