浅谈python标准库--functools.partial


Posted in Python onMarch 13, 2019

一.简单介绍:

 functools模块用于高阶函数:作用于或返回其他函数的函数。一般而言,任何可调用对象都可以作为本模块用途的函数来处理。

 functools.partial返回的是一个可调用的partial对象,使用方法是partial(func,*args,**kw),func是必须要传入的,而且至少需要一个args或是kw参数。

浅谈python标准库--functools.partial

创建一个功能函数,实现三个数的相加,如果其中的一个或是多个参数不变,那么可以使用partial,实例化一个传入了add和12参数的对象,如上图所示,传入两个参数后,得到三个数的和。

二.partial源码分析:

 1.__new__方法部分 

class partial:
 """New function with partial application of the given arguments
 and keywords.
 """
 ###__SLOTS__ 只允许类有此属性,不能动态的添加其他的属性
 __slots__ = "func", "args", "keywords", "__dict__", "__weakref__" 
 ###__new__方法生成实例对象
 def __new__(*args, **keywords):
 ###实例化对象时传入参数的限定,不能为空、参数的个数要大于等于2,这就解释了至少需要一个或多个args或是kw,func是一个可调用的对象,是必须要传入的
 if not args: 
 raise TypeError("descriptor '__new__' of partial needs an argument")
 if len(args) < 2:
 raise TypeError("type 'partial' takes at least one argument")
 cls, func, *args = args # args=(cls,func,*args)
 if not callable(func):
 raise TypeError("the first argument must be callable")
 ### 位置参数是以元组的形式传入的 
 args = tuple(args)
###hasattr这块我也没有咋个明白,不知道可以应用到什么地方,从使用方法来看,传入的函数func要有属性或是方法,如果知道请告知我一下
 if hasattr(func, "func"):
 args = func.args + args
 tmpkw = func.keywords.copy()
 tmpkw.update(keywords)
 keywords = tmpkw
 del tmpkw
 func = func.func 
###创建一个实例对象本身
 self = super(partial, cls).__new__(cls)
###动态的添加属性
 self.func = func 
 self.args = args
 self.keywords = keywords
 return self

上面的代码创建了一个实例对象(p=partial(func,*args,**kw)),并给对象本身添加了属性。

2. __call__方法部分

再看可调用的部分,partial实例化的对象是一个可调用的,是因为在partial中写了__call__方法,看源码:

###在使用p()时会自动调用__call__方法 
 def __call__(*args, **keywords):
 if not args:
 raise TypeError("descriptor '__call__' of partial needs an argument")
 self, *args = args
 ###将位置参数和关键字参数分别合在一起,在使用p()的时候只传入了部分的参数,这是为了我们的方便,不重复传入不变的参数,而在__call__方法中会将func所需的参数全部传入 
 newkeywords = self.keywords.copy()
 newkeywords.update(keywords)
###*self.args是partial(func,*args,**kw)中的*args
 return self.func(*self.args, *args, **newkeywords)

在使用p(*args,**keywords)的时候,就会自动的调用__call__方法,这就是生成的对象可调用的原因,self是实例化对象本身,*args、**kw是我们传入函数func的参数,但是只是传入了部分参数,这也是partial的作用所在,所以还要将partial(func,*args,**kw)中的位置参数和关键字参数与p(*args,**keywords)一并传入到函数func中来实现函数的功能。官网中解释partial的功能实现相当于:

def partial(func, *args, **keywords):
 def newfunc(*fargs, **fkeywords):
 newkeywords = keywords.copy()
 newkeywords.update(fkeywords)
 return func(*args, *fargs, **newkeywords)
 newfunc.func = func
 newfunc.args = args
 newfunc.keywords = keywords
 return newfunc

当调用partial函数的时候,返回的是newfunc函数对象,让f=partial(add,12),相当了f=newfunc,所以f是一个可调用的对象,因此f(1,2)-->等价于newfunc(1,2)-->将参数整合传入到func中,并返回func实现其功能。

浅谈python标准库--functools.partial

以上所述是小编给大家介绍的python标准库--functools.partial详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
使用Python判断IP地址合法性的方法实例
Mar 13 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
python实现机器人行走效果
Jan 29 Python
python爬取淘宝商品销量信息
Nov 16 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
Django配置跨域并开发测试接口
Nov 04 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
Python3实现的简单三级菜单功能示例
Mar 12 #Python
Python3实现的简单工资管理系统示例
Mar 12 #Python
Python3模拟登录操作实例分析
Mar 12 #Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 #Python
Python 函数返回值的示例代码
Mar 11 #Python
浅谈Python批处理文件夹中的txt文件
Mar 11 #Python
Python数据报表之Excel操作模块用法分析
Mar 11 #Python
You might like
坏狼的PHP学习教程之第2天
2008/06/15 PHP
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
Python字符串替换实例分析
2015/05/11 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
纠风工作实施方案
2014/03/15 职场文书
公共场所标语
2014/06/30 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
党员作风建设整改方案
2014/10/27 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
银行求职信怎么写
2019/06/20 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP