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中尝试多线程编程的一个简明例子
Apr 07 Python
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
Python continue继续循环用法总结
Jun 10 Python
python直接获取API传递回来的参数方法
Dec 17 Python
Python代码太长换行的实现
Jul 05 Python
python模块和包的应用BASE_PATH使用解析
Dec 14 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
Python+DeOldify实现老照片上色功能
Jun 21 Python
python playwright之元素定位示例详解
Jul 23 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
多人战的战术与战略
2020/03/04 星际争霸
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
twig里使用js变量的方法
2016/02/05 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python中 logging的使用详解
2017/10/25 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
python集合常见运算案例解析
2019/10/17 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
十佳护士获奖感言
2014/02/18 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
SQL Server中搜索特定的对象
2022/05/25 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server