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 开发Activex组件方法
Nov 08 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
python如何为创建大量实例节省内存
Mar 20 Python
Python中extend和append的区别讲解
Jan 24 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
python如何进行矩阵运算
Jun 05 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
vue项目前端埋点的实现
2019/03/06 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python自动识别文本编码格式代码
2019/12/26 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
开学典礼感言
2014/02/16 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
公司户外活动总结
2014/07/04 职场文书
2015年人事科工作总结
2015/04/28 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
交通安全主题班会
2015/08/12 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python