浅谈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删除nginx缓存文件示例(python文件操作)
Mar 26 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
python使用锁访问共享变量实例解析
Feb 08 Python
Django中Forms的使用代码解析
Feb 10 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
Python中字符串List按照长度排序
Jul 01 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
python实现定时发送邮件
Dec 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默认安装产生系统漏洞
2006/10/09 PHP
PHP 危险函数解释 分析
2009/04/22 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
php微信开发之关注事件
2018/06/14 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python改变日志(logging)存放位置的示例
2014/03/27 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Python 转义字符详细介绍
2017/03/21 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
python操作oracle的完整教程分享
2018/01/30 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
公司禁烟通知
2015/04/23 职场文书
公司庆典主持词
2015/07/04 职场文书
《失物招领》教学反思
2016/02/20 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android