浅谈python标准库--functools.partial

一.简单介绍:

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

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

创建一个功能函数,实现三个数的相加,如果其中的一个或是多个参数不变,那么可以使用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详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Python实现的调用C语言函数功能简单实例

    本文实例讲述了Python实现的调用C语言函数功能.分享给大家供大家参考,具体如下: 实例参考python cookbook 中的15.1节中的例子P612页 先把 c文件编译成 so文件 gcc a.c -fpic -shared -o lib.so 通过上面编译成so文件 利用ctypes模块. from ctypes import cdll a=cdll.LoadLibrary("./lib.so") a.say() 能过上面代码测试通过. 更多关于Python相关内容感兴趣的读

  • Python使用sqlalchemy模块连接数据库操作示例

    本文实例讲述了Python使用sqlalchemy模块连接数据库操作.分享给大家供大家参考,具体如下: 安装: pip install sqlalchemy # 安装数据库驱动: pip install pymysql pip install cx_oracle 举例:(在url后面加入?charset=utf8可以防止乱码) from sqlalchemy import create_engine engine=create_engine('mysql+pymysql://username:p

  • Python3实现的简单三级菜单功能示例

    本文实例讲述了Python3实现的简单三级菜单功能.分享给大家供大家参考,具体如下: 三级菜单_要求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 执行代码: #!/usr/bin/env python3 # Author:Robert # --*-- coding: utf-8 --*-- data = { "北京":{ "东城区":{

  • 详解python中init方法和随机数方法

    1.__init__方法的使用 2.random方法的使用 在python中,有一些方法是特殊的,是以两个下划线开始,两个下划线结束,定义类,最常用的方法就是__init__()方法,这是类的初始化方法,类似于C#或Java的构造函数.在创建对象的时候自动执行. class Person(object): ''' 这里定义的属性 为 静态的 ''' empCount = 0 # 创建对象的时候自动执行 def __init__(self, name): print('初始化方法.....') s

  • Python3实现的简单工资管理系统示例

    本文实例讲述了Python3实现的简单工资管理系统.分享给大家供大家参考,具体如下: 工资管理系统要求: 1. 查询员工工资 2. 修改员工工资 3. 增加新员工记录 4. 退出 执行代码: #!/usr/bin/env python3 # Author:Robert # --*-- coding: utf-8 --*-- def file_test(): with open("info.txt",'r',encoding="utf-8") as f: file =

  • 浅谈Python中eval的强大与危害

    eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果.想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果. python中eval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点.本文从灵活性和危险性两方面介绍eval. 1.强大之处 举几个例子感受一下,字符串与list.tuple.dict的转化. a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]&

  • 在Python中使用Neo4j的方法

    Neo4j是面向对象基于Java的 ,被设计为一个建立在Java之上.可以直接嵌入应用的数据存储.此后,其他语言和平台的支持被引入,Neo4j社区获得持续增长,获得了越来越多的技术支持者.目前已支持.NET.Ruby.Python.Node.js及PHP等.因此,不管是什么项目,没有理由不引入Neo4j. 本文重点介绍Python,这门语言的哲学与Java大大不同,同时展示py2neo库如何被用来建立一个简单的应用程序. 一个快速的REST例子 首先来看些基本知识.如果没有服务API,Neo4j

  • Python实现的列表排序、反转操作示例

    本文实例讲述了Python实现的列表排序.反转操作.分享给大家供大家参考,具体如下: 排序: 使用sorted方法和列表的sort方法: sorted方法适用范围更广,sort方法只有列表有. li = [{'a':'23'}, {'a':'12'}] def sort_fun(mp): s = mp['a'] return int(s) print(sorted(li, key = sort_fun, reverse = True)) #这会返回一个排好序的列表,原列表不变. print(li

  • Python3调用百度AI识别图片中的文字功能示例【测试可用】

    本文实例讲述了Python3调用百度AI识别图片中的文字功能.分享给大家供大家参考,具体如下: 首先pip install命令安装baidu-aip模块,如下图所示(这里使用pip3 install baidu-aip命令): 编辑Python代码时注意,需要首先引入AipOcr和re两个模块,即: from aip import AipOcr import re 示例代码如下: from aip import AipOcr import re APP_ID='***' API_KEY='***

  • python ---lambda匿名函数介绍

    lambda特性:"一个语法,三个特性,四个用法" 一个语法 在Python中,lambda的语法是唯一的.其形式如下: lambda argument_list: expression 其中,lambda是Python预留的关键字,argument_list和expression由用户自定义.具体介绍如下. 1.这里的argument_list是参数列表.它的结构与Python中函数(function)的参数列表是一样的.具体来说,argument_list可以有非常多的形式.例如:

随机推荐