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爬虫获取黄金价格的核心代码
Jun 13 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
python爬虫获取新浪新闻教学
Dec 23 Python
pywinauto自动化操作记事本
Aug 26 Python
Django中的FBV和CBV用法详解
Sep 15 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
scrapy-splash简单使用详解
Feb 21 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设计模式 Prototype (原型模式)代码
2011/06/26 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
checkbox使用示例
2013/08/23 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
原生JS实现瀑布流插件
2018/02/06 Javascript
node中的session的具体使用
2018/09/14 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
python为什么会环境变量设置不成功
2020/06/23 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
入党积极分子自我鉴定
2014/02/18 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
美德少年主要事迹材料
2015/11/04 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python