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

问题描述

我正在为 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。

解决方法

在下面的代码中,我创建了一个带有单个 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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...