向现有 Python 类添加函数的模式

Posted

技术标签:

【中文标题】向现有 Python 类添加函数的模式【英文标题】:Pattern to add functions to existing Python classes 【发布时间】:2021-05-14 00:17:29 【问题描述】:

我正在为 pandas 编写一个辅助库。

与 scala 隐式类似,我想将我的自定义函数添加到现有 Python 类(在本例中为 pandas.DataFrame)的所有实例中,我无法控制它:我无法修改它,我无法扩展它并要求用户使用我的扩展而不是原来的类。

import pandas as pd

df = pd.DataFrame(...)
df.my_function()

使用 Python 3.6+ 实现此目的的建议模式是什么?

如果这确实无法实现,那么在 Python 中用于类似目标的最常见、稳健、清晰且最不令人惊讶的模式是什么?我们可以通过要求 Python 3.7+、3.8+ 或 3.9+ 来获得更好的结果吗?

我知道可以在运行时修补单个实例或类以添加方法。这不是我想要做的:我更喜欢更优雅和健壮的解决方案,适用于整个类而不是单个实例,IDE 友好,因此代码完成可以建议 my_function

我的案例是针对 pandas.DataFrame 的,因此仅适用于此类的解决方案也可以,只要它使用 pandas 的文档化官方 API。

【问题讨论】:

【参考方案1】:

在下面的代码中,我创建了一个带有单个 self 参数的函数。 该函数被分配给pd.DataFrame类的一个属性,如果作为方法可调用。

import pandas as pd

def my_new_method(self):
    print(type(self))
    print(self)

pd.DataFrame.new_method = my_new_method
df = pd.DataFrame('col1': [1, 2, 3])
df.new_method()

【讨论】:

我认为这非常符合我提到的我不想做的事情。无论如何,感谢您对如何实现所涉及类的这个“运行时补丁”的建议。

以上是关于向现有 Python 类添加函数的模式的主要内容,如果未能解决你的问题,请参考以下文章

将基类添加到python中的现有对象

从函数定义外部向 Python 类添加数据成员

向现有结构添加元素会使函数在分段错误时崩溃

向函数返回的类添加方法

通过python根据条件向html添加类

Python / C-Api:向模块添加类