partial和partialmethod有什么区别?

时间:2017-03-16 20:57:32

标签: python python-3.x functools

我发现Python 3的functools模块有两个非常相似的方法:partialpartialmethod

有人可以提供使用每个人的好例子吗?

2 个答案:

答案 0 :(得分:3)

partial用于冻结参数和关键字。它会通过部分应用给定参数和关键字来创建一个新的可调用对象。

from functools import partial
from operator import add

# add(x,y) normally takes two argument, so here, we freeze one argument and create a partial function.
adding = partial(add, 4)
adding(10)        # outcome will be add(4,10) where `4`  is the freezed arguments.

当您要将数字列表映射到一个函数但保持一个参数冻结时,这很有用。

# [adding(4,3), adding(4,2), adding(4,5), adding(4,7)]
add_list = list(map(adding, [3,2,5,7])) 

partialmethod是python 3.4中引入的,它打算在类中用作方法定义,而不是可以直接调用

from functools import partialmethod
class Live:
    def __init__(self):
        self._live = False
    def set_live(self,state:'bool'):
        self._live = state
    def __get_live(self):
        return self._live
    def __call__(self):
        # enable this to be called when the object is made callable.
        return self.__get_live()

    # partial methods. Freezes the method `set_live` and `set_dead`
    # with the specific arguments
    set_alive = partialmethod(set_live, True)
    set_dead = partialmethod(set_live, False)

live = Live() # create object
print(live()) # make the object callable. It calls `__call__` under the hood
live.set_alive() # Call the partial method
print(live())

答案 1 :(得分:2)

正如@HaiVu在他的评论中所说,在一个类定义中调用部分将创建一个静态方法,而partialmethod将创建一个新的绑定方法,当被调用时将自己作为第一个参数传递。