浅谈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求导数的方法
May 09 Python
详解Python的Django框架中的templates设置
May 11 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
Python参数类型以及常见的坑详解
Jul 08 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 Python
python解决12306登录验证码的实现
Apr 18 Python
Python实现抖音热搜定时爬取功能
Mar 16 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获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
python下MySQLdb用法实例分析
2015/06/08 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
公司应聘自荐书
2014/06/14 职场文书
2015元旦标语横幅
2014/12/09 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python