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中的map、reduce和filter浅析
Apr 26 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
深入学习Python中的装饰器使用
Jun 20 Python
python numpy元素的区间查找方法
Nov 14 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
Python中Numpy ndarray的使用详解
May 24 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
python实现图片上添加图片
Nov 26 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
python numpy实现rolling滚动案例
Jun 08 Python
Keras多线程机制与flask多线程冲突的解决方案
May 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
Sony CFR 320 修复改造
2020/03/14 无线电
JQuery 入门实例1
2009/06/25 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
Javascript事件实例详解
2013/11/06 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Python批量查询域名是否被注册过
2017/06/21 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
python如何实现数据的线性拟合
2019/07/19 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
python 实现客户端与服务端的通信
2020/12/23 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
读书心得体会
2013/12/28 职场文书
《散步》教学反思
2014/03/02 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技