python-3.x - 向现有 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()
推荐阅读
- python - SQL:如何使用 pyodbc 从选择查询中获取最新/最大 ID
- python - 当树莓派使用 /etc/rc.local 启动时如何运行多个 python 脚本
- javascript - 删除 JavaScript 对象数组中的重复项并对条目求和
- apache-spark - Spark Executor 以本地或独立模式登录
- python - Jinja2 数字格式
- reactjs - How to avoid useRef when the parent wants the child to do something?
- java - 如何使用 apche 元模型将数据插入 csv 文件?
- generics - 如何从通用函数指针迭代两个迭代器之一(没有 Box)
- html - 可以强制 html datalist 仅下拉吗?
- docker - 尝试在 Docker 容器中的 Debian 上运行 Zookeeper 时出错