官方相关地址:https://docs.python.org/3.6/library/functools.html

一.简单介绍:

functools模块用于高阶函数:作用于或返回其他函数的函数。一般而言,任何可调用对象都可以作为本模块用途的函数来处理。

functools.partial返回的是一个可调用的partial对象,使用方法是partial(func,*args,**kw),func是必须要传入的,而且至少需要一个args或是kw参数。

创建一个功能函数,实现三个数的相加,如果其中的一个或是多个参数不变,那么可以使用partial,实例化一个传入了add和12参数的对象,如上图所示,传入两个参数后,得到三个数的和。

二.partial源码分析:

1.__new__方法部分

  1. class partial:
  2. """New function with partial application of the given arguments
  3. and keywords.
  4. """
  5. ###__SLOTS__ 只允许类有此属性,不能动态的添加其他的属性
  6. __slots__ = "func", "args", "keywords", "__dict__", "__weakref__"
  7. ###__new__方法生成实例对象
  8. def __new__(*args, **keywords):
  9. ###实例化对象时传入参数的限定,不能为空、参数的个数要大于等于2,这就解释了至少需要一个或多个args或是kw,func是一个可调用的对象,是必须要传入的
  10. if not args:
  11. raise TypeError("descriptor '__new__' of partial needs an argument")
  12. if len(args) < 2:
  13. raise TypeError("type 'partial' takes at least one argument")
  14. cls, func, *args = args # args=(cls,func,*args)
  15. if not callable(func):
  16. raise TypeError("the first argument must be callable")
  17. ### 位置参数是以元组的形式传入的
  18. args = tuple(args)
  1. ###hasattr这块我也没有咋个明白,不知道可以应用到什么地方,从使用方法来看,传入的函数func要有属性或是方法,如果知道请告知我一下
  2. if hasattr(func, "func"):
  3. args = func.args + args
  4. tmpkw = func.keywords.copy()
  5. tmpkw.update(keywords)
  6. keywords = tmpkw
  7. del tmpkw
  8. func = func.func
  9. ###创建一个实例对象本身
  10. self = super(partial, cls).__new__(cls)
  11. ###动态的添加属性
  12. self.func = func
  13. self.args = args
  14. self.keywords = keywords
  15. return self

上面的代码创建了一个实例对象(p=partial(func,*args,**kw)),并给对象本身添加了属性。

2. __call__方法部分

再看可调用的部分,partial实例化的对象是一个可调用的,是因为在partial中写了__call__方法,看源码:

  1. ###在使用p()时会自动调用__call__方法
  2. def __call__(*args, **keywords):
  3. if not args:
  4. raise TypeError("descriptor '__call__' of partial needs an argument")
  5. self, *args = args
  6. ###将位置参数和关键字参数分别合在一起,在使用p()的时候只传入了部分的参数,这是为了我们的方便,不重复传入不变的参数,而在__call__方法中会将func所需的参数全部传入
  7. newkeywords = self.keywords.copy()
  8. newkeywords.update(keywords)
  9. ###*self.args是partial(func,*args,**kw)中的*args
  10. 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的功能实现相当于:

  1. def partial(func, *args, **keywords):
  2. def newfunc(*fargs, **fkeywords):
  3. newkeywords = keywords.copy()
  4. newkeywords.update(fkeywords)
  5. return func(*args, *fargs, **newkeywords)
  6. newfunc.func = func
  7. newfunc.args = args
  8. newfunc.keywords = keywords
  9. return newfunc

当调用partial函数的时候,返回的是newfunc函数对象,让f=partial(add,12),相当了f=newfunc,所以f是一个可调用的对象,因此f(1,2)-->等价于newfunc(1,2)-->将参数整合传入到func中,并返回func实现其功能。

转载于:https://www.cnblogs.com/qunxiadexiaoxiangjiao/p/9577734.html

python标准库--functools.partial相关推荐

  1. python functools partial_浅谈python标准库--functools.partial

    一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的par ...

  2. Python 标准库 functools 模块详解

    functools 官方文档:https://docs.python.org/zh-cn/3/library/functools.html Python 标准模块 --- functools:http ...

  3. python functools partial_python标准库--functools.partial

    官方相关地址:https://docs.python.org/3.6/library/functools.html 一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般 ...

  4. Python标准库笔记(9) — functools模块

    functools 作用于函数的函数 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们. 装饰器 partial 类是 functools 模块提供的主要工具, ...

  5. Python标准库之 functools

    巨人的肩膀 Python标准库之 functools/itertools/operator 凉菜 functools, itertools, operator是Python标准库为我们提供的支持函数式 ...

  6. python中wraps_python 装饰器及标准库functools中的wraps

    最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点 ...

  7. Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...

  8. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

  9. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

最新文章

  1. 人工智能的学习经验总结!
  2. WCF:如何将net.tcp协议寄宿到IIS
  3. Android应用开发-广播和服务
  4. PyQt4编程之如何让状态栏显示信息
  5. 团队博客第五周 运行与总结
  6. 鸿蒙系统公测版发布,鸿蒙OS2.0系统公测版什么时候发布-适配机型
  7. STM32之ADC原理
  8. 收藏 | LSTM模型结构的可视化
  9. Quartz2D简单绘制之矩形椭圆
  10. MobileNetV2: Inverted Residuals and Linear Bottlenecks
  11. android返回按钮实现,Android实现返回键操作思路
  12. 不限流量的物联卡是否真存在
  13. sql or 与and同时有时要注意
  14. js中比較好的继承方式
  15. 个人博客系统需求文档
  16. Excel如何快速生成二维码图片?
  17. tensorflow实战之手写体识别
  18. 机器学习模型度量方法,分类及回归模型评估
  19. java编写的公共钥匙盒_公共钥匙盒.java
  20. Julia数据可视化:Gadfly.jl包的使用

热门文章

  1. 《小学生C++趣味编程》第42课 最小公倍数
  2. php的api数据接口书写实例
  3. python 线性规划问题_一学高数,线代就头疼?让python帮你解决(内含教程)
  4. python numpy和pandas数据处理_python中添加数据分析工具numpy和pandas
  5. Qt学习之Qt基础入门(中)
  6. BootStrap笔记-BootStrap的安装与使用
  7. Qt文档阅读笔记-QCompleter官方解析及实例
  8. Python笔记-解决开启Fiddler后Requests存在SSLError问题
  9. HTTP协议方法及状态码(HTTP协议入门必备)
  10. Qt工作笔记-QSort的基本使用