浅谈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、Javascript中的闭包比较
Feb 04 Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
在Python的web框架中配置app的教程
Apr 30 Python
深入解答关于Python的11道基本面试题
Apr 01 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
Django数据库连接丢失问题的解决方法
Dec 29 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
python matplotlib包图像配色方案分享
Mar 14 Python
Keras 快速解决OOM超内存的问题
Jun 11 Python
python中subplot大小的设置步骤
Jun 28 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 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操作文件方法问答
2007/03/16 PHP
php重定向的三种方法分享
2012/02/22 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
php文件读取方法实例分析
2015/06/20 PHP
js切换div css注意的细节
2012/12/10 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
Python中字符编码简介、方法及使用建议
2015/01/08 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
python字符串中的单双引
2017/02/16 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
linux面试题参考答案(4)
2014/09/21 面试题
乔迁宴答谢词
2014/01/21 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
住房租房协议书
2014/08/20 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
西安大雁塔导游词
2015/02/10 职场文书
工作收入证明模板
2015/06/12 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS