浅谈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 中文字符串的处理实现代码
Oct 25 Python
python获取豆瓣电影简介代码分享
Jan 16 Python
Python脚本实现12306火车票查询系统
Sep 30 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
flask中过滤器的使用详解
Aug 01 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
python datetime时间格式的相互转换问题
Jun 11 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
pycharm 关闭search everywhere的解决操作
Jan 15 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调用Java对象的方法
2006/10/09 PHP
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
PHP chr()函数讲解
2019/02/11 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
Python、Javascript中的闭包比较
2015/02/04 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
医学生个人求职信范文
2013/09/24 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
Docker部署Mysql8的实现步骤
2022/07/07 Servers
mysql数据库如何转移到oracle
2022/12/24 MySQL