浅谈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实现模拟登录及表单提交的方法
Jul 25 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
python计算两个地址之间的距离方法
Jun 09 Python
Django异步任务之Celery的基本使用
Mar 23 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Python对称的二叉树多种思路实现方法
Feb 28 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中用memcached实现页面防刷新功能
2014/08/19 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
php实现的验证码文件类实例
2015/06/18 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
浅谈MySQL中的触发器
2015/05/05 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
python中的lambda表达式用法详解
2016/06/22 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python区分不同数据类型的方法
2019/10/14 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
大学生应聘推荐信范文
2013/11/19 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
关于旷工的检讨书
2014/02/02 职场文书
捐资助学倡议书
2014/04/15 职场文书
社团活动总结报告
2014/06/27 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
个人自查自纠材料
2014/10/14 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
二审代理词范文
2015/05/25 职场文书
汉字听写大会观后感
2015/06/12 职场文书
离职告别感言
2015/08/04 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL