# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

#functools:管理函数工具

#作用:处理其他函数的函数

#版本:2.5及之后

#用于调整或者扩展函数和其他可回调对象,不用重写

#修饰符:主要工具是partial在,用于包装,一个有默认参数可回调对象。得到对象本身是可回调的,可以看作就像是原来的函数,它与原函数完全相同,调用时也可以提供额外的位置或者命名参数,可以使用partial而不是lambda提供的默认参数,有些参数可不指定

#partial对象

import functools

def myfunc(a,b=2):

'''docstring for myfunc().'''

print ' called myfunc with:',(a,b)

return

def show(name,f,is_partial=False):

print name

print f

if not is_partial:

print f.__name__

if is_partial:

print f.func

print f.args

print f.keywords

return

show('myfunc',myfunc)

myfunc('a',3)

print

p1=functools.partial(myfunc,b=4)

show('partial with named default',p1,True)

p1('passing a')

p1('override b',b=5)

#p1()#TypeError: myfunc() takes at least 1 argument (1 given)

#获取函数属性

#默认情况下,partial对象没有__name__或者__doc__属性。如果没有这些属性,修饰函数更加难调试,使用update_wrapper()可以将原函数属性或者添加到oartial对象

def myfunc1(a,b=2):

'''docstring for myfunc().'''

print ' called myfunc with:',(a,b)

return

def show2(n,f):

print n

print f

print '__name__'

try:

print f.__name__

except AttributeError,s:

print 'no __name__',s

print repr(f.__doc__)

print

return

show2('myfunc1',myfunc1)

p1=functools.partial(myfunc1,b=4)

show2('raw wrapper',p1)

print functools.WRAPPER_ASSIGNMENTS

print functools.WRAPPER_UPDATES

functools.update_wrapper(p1,myfunc1)

show2('updated wrapper',p1)

#其他可回调#Paryisl适用于任何可回调对象,而不只是单独的函数

class MyClass(object):

def method1(self,a,b=2):

print self,a,b

return

def methond2(self,c,d=5):

print self,c,d

return

wrapp=functools.partial(methond2,'wrapped c')

functools.update_wrapper(wrapp,methond2)

def __call__(self,x,z=6):

print self,x,z

return

def show_update(n,f):

print n

print f

print '__name__'

try:

print f.__name__

except AttributeError,s:

print 'no __name__',s

print repr(f.__doc__)

print

return

o=MyClass()

show_update('method1 straight',o.method1)

o.method1('on default for a',b=3)

print

p1=functools.partial(o.method1,b=4)

functools.update_wrapper(p1,o.method1)

show_update('method1 wrarer',p1)

functools:管理函数工具(部分)的更多相关文章

  1. Python3标准库:functools管理函数的工具

    1. functools管理函数的工具 functools模块提供了一些工具来调整或扩展函数和其他callable对象,从而不必完全重写. 1.1 修饰符 functools模块提供的主要工具就是pa ...

  2. μC/OS-Ⅲ系统的时间管理函数和定时器

    一.时间管理函数 μC/OS-Ⅲ系统提供一些列时间管理服务函数: 1.OSTimeDly():任务延时n个时钟节拍. 2.OSTimeDlyHMSM():任务延时指定的时间,采用“时:分:秒:毫秒”方 ...

  3. 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。

    (1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...

  4. JBPM4入门——4.封装流程管理的工具类(JbpmUtil)

    本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...

  5. POSIX多线程——基本线程管理函数介绍

    POSIX基本的几个线程管理函数见下表: ------------------------------------------------------------------------------- ...

  6. [图形学] Chp9 三维几何变换--栈处理函数与矩阵管理函数的区别

    矩阵管理函数:glLoadIdentity()是把当前活动矩阵设置为单位矩阵. 栈处理函数:glPushMatrix()是将当前活动的变换矩阵复制一份,压入栈顶:glPopMatrix()是破坏当前活 ...

  7. 基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!

    基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线! https://www.sohu.com/a/168292858_747818 https://github.com/ ...

  8. C++内存管理-重载内存管理函数

    记录学习的点点滴滴,参考侯捷<<C++内存管理>> 我们先重载一下C++的几个内存管理函数 operator new, operator new[], operator del ...

  9. linux进程查看及管理的工具

     介绍Linux进程查看及管理的工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, jo ...

随机推荐

  1. 利用扩展双屏技术及Chrome浏览器,高速剖析优秀网页Div及CSS构成,并高效实现原型创作

    作为一个Web前台设计人员,应该充分利用可利用的硬件条件及专业的软件工具,迅速进入到高效氛围其中.实践中,我们能够利用扩展桌面双屏技术及Chrome浏览器高速剖析优秀网页Div及CSS构成,并高速实现 ...

  2. Oracle数据库的创建与验证

    创建数据库,输入命令dbca创建数据库 会弹出创建数据库相应的对话框 单击下一步 选择创建一个数据库,并单击下一步 数据库模板选择一般目的的转换过程即可.单击下一步 全局数据库名称和SID名称,要和上 ...

  3. iOS中AutoLayer自动布局流程及相关方法【转】

    转自:http://my.oschina.net/w11h22j33/blog/208574 关于UIView的Layer,IOS提供了三个方法: 1.layoutSubviews 在iOS5.1和之 ...

  4. PL/SQL中字符串变量的分割转化

    在编写PL/SQL时,有时候我们需要处理这样一个输入的变量,它的格式是由多个值通过分隔符组成的字符串,如“1,2,3”,我们需要将这个变量加入到我们的SQL中,形成诸如in('1','2','3')的 ...

  5. MySQL在Linux系统下配置文件详解

    在日常的的开发过程中接触到了SQLServer和MySQL数据库的操作性问题,可能是以前接触的都是SQL Server,才开始接触MySQL,总感觉使用MySQL没有使用SQLserver那么顺手,一 ...

  6. C++类中的静态成员变量与静态成员函数的使用

    代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...

  7. ESP8266固件修改可以控制多个IO方法

    之前在论坛上找到了一个通过ESP8266可以控制GPIO0的固件和app,但是自己做的家庭影音灯光系统是需要控制多个IO从而控制STM32.通过观看大明的视频,了解了GPIO的控制方法. 在固件的ap ...

  8. css3之gradient

    radial-gradient The CSS radial-gradient() function creates an <image> which represents a gradi ...

  9. Oracle 10g体系结构及安全管理

    (1)               Oracle数据库服务器:数据库,实例 (2)               数据库:(1)物理存储—数据文件,控制文件,日志文件,(2)逻辑存储—表空间,段,区间, ...

  10. worklight 中添加时间控件

    在我们使用worklight开发的过程中,由于文档的不开源和插件的缺少,总是自己琢磨很多东东,更有胜者 需要调用源代码实现某些不易实现的功能.在这里把实现的功能代码贴出来,如有不足之处还望指正! 实现 ...