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爬取三国演义的实现方法
Sep 12 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
使用python3+xlrd解析Excel的实例
May 04 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
详解python常用命令行选项与环境变量
Feb 20 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
Python代码中如何读取键盘录入的值
May 27 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 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面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
php数组去重实例及分析
2013/11/26 PHP
php GUID生成函数和类
2014/03/10 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
Python数据可视化图实现过程详解
2020/06/12 Python
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
数学系个人求职信范文
2014/01/30 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
售后服务承诺书模板
2014/05/21 职场文书
另类冲刺标语
2014/06/24 职场文书
项目转让协议书
2014/10/27 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
餐厅开业活动方案
2019/07/08 职场文书
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
详解PyTorch模型保存与加载
2022/04/28 Python