Python装饰器和回调函数
1.装饰器
装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现。
import functools def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper @log
def now():
print('2015-3-25') 给函数now定义了一个装饰器log,实现功能:在调用函数之前,打印出函数的名字 最终的输出是:
>>> now()
call now():
--
2.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
个人理解的回调函数类似于这样一种情况,产品经理需要实现某种功能,需要找到开发,开发说我可以帮你写个函数实现这个功能,但是功能有点复杂,在不同的情况下需要传入不同的参数,这个参数是需要你来给我的。
一般应用于对应某一事件触发的函数。比方要实现爬虫,我可以帮你写个爬虫函数,但是你首先得知道要爬虫网站的URL,大概就是这样一个意思。
回调函数丰富了函数的调用方法,给开发带来很多方便。
In []: def test(num):
...: for i in range(num):
...: print 'hello,world' In []: def call(times,funcname):
...: return funcname(times) In []: call(,test)
hello,world
hello,world
hello,world
Python装饰器和回调函数的更多相关文章
- 计算机基础,Python - 回调函数,使用装饰器注册回调函数
1. 参考: https://en.wikipedia.org/wiki/Callback_(computer_programming) https://developer.mozilla.org/e ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- python装饰器 高阶函数 函数闭包
1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...
- python装饰器内获取函数有用信息方法
装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...
- python 装饰器统计某个函数的运行时间
import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
- python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...
- Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)
Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...
随机推荐
- STL序列式容器之list
一,list容器基本概念 1.list容器基本知识 list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素. list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作. ...
- spring应用实例
新建一个登陆页面:loginActionSupport.jsp,代码例如以下 <%@page contentType="text/html;charset=GBK" is ...
- Xcode 4.5( iOS6 SDK)、旧版本号cocos2d,支持iPhone5解析度
支持iPhone5全屏 1假设没有支持iPhone5是否.直接运行程序可以准备提交.开放iPhone5模拟器,你会发现上面有黑色的程序.没有矩形. 2真正运行该程序时,.你会发现程序回程屏幕高度.它是 ...
- 《DELPHI赋》
<DELPHI赋> -- 武汉NET_TO_DB DELPHI者,经典开发工具.美奂美仑之开发环境也.盖论DELPHI其身世,实为神界之神物,后借宝蓝公司之手,于1990年代,现于江湖. ...
- 创建网站 并未网站指定ftp用户
这里有个视频 前10分钟可以参考 在windows server2008 r2上面安装iis 带ftp服务 :http://v.youku.com/v_show/id_XMjUyMTE1MTI0NA= ...
- readline库的使用
接口十分简单,readline和addhistory: #include <stdlib.h> #include <stdio.h> #include <unistd.h ...
- Hibernate入门配置案例
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...
- JDK源码阅读——LinkedList实现
1 继承结构图 LinkedList是List的另一种实现.继承自AbstractSequentialList 2 数据结构 LinkedList与ArrayList不同的是LinkedList底层使 ...
- Lexer的设计--下(5)
一个礼拜之后我终于从成都回来了, 从今天开始更新会恢复... 一点小的改进 写lex()的时候距离我上一次写已经一个礼拜了, 所以我回顾了一下之前的代码, 发现还是有瑕疵. 比如考虑到一个较短的程序, ...
- WPF 数据模板的使用
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...