浅谈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基于xml parse实现解析cdatasection数据
Sep 30 Python
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
Python函数的周期性执行实现方法
Aug 13 Python
Python实现读取并保存文件的类
May 11 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
Python csv文件的读写操作实例详解
Nov 19 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
Python中如何添加自定义模块
Jun 09 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 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隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
PHP编写简单的App接口
2016/08/28 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
树莓派实现移动拍照
2019/06/22 Python
python实现拼接图片
2020/03/23 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
中文系学生自荐信范文
2013/11/13 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
党员自我对照检查材料
2014/08/19 职场文书
教师个人师德总结
2015/02/06 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书