浅谈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中强大的命令行库click入门教程
Dec 26 Python
Python 调用Java实例详解
Jun 02 Python
基于python实现简单日历
Jul 28 Python
python自动发送测试报告邮件功能的实现
Jan 22 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
Python Process创建进程的2种方法详解
Jan 25 Python
Python标准库之typing的用法(类型标注)
Jun 02 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
实例讲解PHP表单
2020/06/10 PHP
[JS]点出统计器
2020/10/11 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
JS动态日期时间的获取方法
2015/09/28 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
详解vue中axios的封装
2018/07/18 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
python实现UDP协议下的文件传输
2020/03/20 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
Android存储中最基本的文件存储方式
2022/04/30 Java/Android