说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 内置模块 functools 的一个高阶函数 partialmethod 与 partial() 偏函数 类似,partialmethod 偏方法也是在对象里对已有的方法进行派生,将功能复杂的方法衍生出简单功能的方法。这是从 Python 3.4 版新功能。
对于python 偏函数partial理解运用起来比较简单,就是对原函数某些参数设置默认值,生成一个新函数。而如果对于类方法,因为第一个参数是 self,使用 partial 就会报错了。
class functools.partialmethod(func, /, *args, **keywords)
返回一个新的 partialmethod 描述器,其行为类似 partial 但它被设计用作方法定义而非直接用作可调用对象。
func 必须是一个 descriptor 或可调用对象(同属两者的对象例如普通函数会被当作描述器来处理)。
当 func 是一个描述器(例如普通 Python 函数, classmethod(), staticmethod(), abstractmethod() 或其他 partialmethod 的实例)时, 对 __get__
的调用会被委托给底层的描述器,并会返回一个适当的 部分对象 作为结果。
当 func 是一个非描述器类可调用对象时,则会动态创建一个适当的绑定方法。 当用作方法时其行为类似普通 Python 函数:将会插入 self 参数作为第一个位置参数,其位置甚至会处于提供给 partialmethod 构造器的 args 和 keywords 之前。
以下是案例。
以下是一个官网的实例:
from functools import partialmethod
class Cell:
def __init__(self):
self._alive = False
@property
def alive(self):
return self._alive
def set_state(self, state):
self._alive = bool(state)
set_alive = partialmethod(set_state, True)
set_dead = partialmethod(set_state, False)
print(type(partialmethod(set_state, False)))
# <class 'functools.partialmethod'>
c = Cell()
c.alive
# False
c.set_alive()
c.alive
# True
c.set_alive() 和 c.set_dead() 作为 Cell 的方法,更加直观,省去专门的定义代码。
pandas 的 apply 方法 默认 axis=0 按行去操作,我们需要一个派生一个按列的的操作:
from functools import partialmethod
import pandas as pd
import pandas._testing as tm
df = tm.makeDataFrame()
df
'''
A B C D
D4mjVx3GtT 1.808966 -1.199819 -0.779483 -0.566463
ylYk4vm4MZ -1.509050 -0.361186 0.486100 0.021837
tDbfPX8Eva 0.141416 0.397220 0.172930 -0.504479
...
19tYkM1qrE -0.617952 1.137066 -0.962393 0.982731
mpQIQkifPC 0.874417 0.226630 0.739977 -0.786624
'''
# 使用原函数
df.apply(sum)
'''
A 4.621611
B 8.959269
C 0.126089
D 2.828309
dtype: float64
'''
# 定义偏方法
pd.DataFrame.apply_col = partialmethod(pd.DataFrame.apply, axis=1)
# 使用偏方法
df.apply_col(sum)
'''
D4mjVx3GtT -0.736799
ylYk4vm4MZ -1.362299
tDbfPX8Eva 0.207087
...
19tYkM1qrE 0.539452
mpQIQkifPC 1.054401
dtype: float64
'''
partialmethod 派生出的新方法是一个 partial 对象,它有 args、func、keywords 三个属性,如在上例中:
pd.DataFrame.apply_col
# functools.partial(<function DataFrame.apply at 0x7fdb3057ae60>, axis=1)
pd.DataFrame.apply_col.args
# ()
pd.DataFrame.apply_col.func
# <function pandas.core.frame.DataFrame.apply(self, func: 'AggFuncType',
# axis: 'Axis' = 0, raw: 'bool' = False, result_type=None, args=(), **kwargs)>
pd.DataFrame.apply_col.keywords
# {'axis': 1}
详情可见 partial 偏函数 中的 partial 对象介绍。
partialmethod 针对对象中的方法进行派生,partial 是对独立的函数进行派生。偏函数 partial 对原函数某些参数设置默认值,生成一个新函数。而如果对于类方法,因为第一个参数是 self,使用 partial 就会报错,因此要使用 partialmethod。
可见 partial 偏函数 的相关介绍。
更新时间:2022-01-19 10:09:16 标签:python 方法 对象