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全局变量操作详解
Apr 14 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
简单谈谈Python中的json与pickle
Jul 19 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
Pythony运维入门之Socket网络编程详解
Apr 15 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
小结Python的反射机制
Sep 28 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
一个分页的论坛
2006/10/09 PHP
用header 发送cookie的php代码
2007/03/16 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
jquery 学习之二 属性(类)
2010/11/25 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python面向对象封装操作案例详解
2019/12/31 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
一些高难度的SQL面试题
2016/11/29 面试题
优秀体育委员自荐书
2014/01/31 职场文书
导购员的岗位职责
2014/02/08 职场文书
小学毕业感言300字
2014/02/19 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
临床医师个人自我评价
2014/04/06 职场文书
文明之星事迹材料
2014/05/09 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android