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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
python黑魔法之参数传递
Feb 12 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
Python实现购物车功能的方法分析
Nov 10 Python
python单例模式实例解析
Aug 28 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
python dlib人脸识别代码实例
Apr 04 Python
Python 数据可视化pyecharts的使用详解
Jun 26 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Python 判断时间是否在时间区间内的实例
May 16 Python
python Yaml、Json、Dict之间的转化
Oct 19 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输出表格的实现代码(修正版)
2010/12/29 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php 操作调试的方法
2012/07/12 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python 接口返回的json字符串实例
2018/03/27 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Python netmiko模块的使用
2020/02/14 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
如何利用find命令查找文件
2016/11/18 面试题
高中生自我鉴定范文
2013/10/30 职场文书
会计专业应届生求职信
2013/11/24 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
大二自我鉴定
2014/01/31 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
社区灵活就业证明
2014/11/03 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis