浅谈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中列表(list)操作方法汇总
Aug 18 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
Python自动发邮件脚本
Mar 31 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
python django生成迁移文件的实例
Aug 31 Python
Python使用20行代码实现微信聊天机器人
Jun 05 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
Python编程中内置的NotImplemented类型的用法
Mar 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
PHP5中MVC结构学习
2006/10/09 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python实现excel读写数据
2021/03/02 Python
Python调用服务接口的实例
2019/01/03 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
西安兵马俑导游词
2015/02/02 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书