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高效编程技巧
Jan 07 Python
利用Python绘制MySQL数据图实现数据可视化
Mar 30 Python
Python写入CSV文件的方法
Jul 08 Python
Python入门之三角函数tan()函数实例详解
Nov 08 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python从子线程中获得返回值的方法
Jan 30 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
python对接ihuyi实现短信验证码发送
May 10 Python
python调用win32接口进行截图的示例
Nov 11 Python
Python排序函数的使用方法详解
Dec 11 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获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
php实现的双向队列类实例
2014/09/24 PHP
php中socket的用法详解
2014/10/24 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
员工薪酬激励方案
2014/06/13 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
理财计划书
2014/08/14 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
python实现MD5进行文件去重的示例代码
2021/07/09 Python
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL