【问题标题】:Is it possible to extend a class from __init__.py是否可以从 __init__.py 扩展一个类
【发布时间】:2020-03-02 19:02:09
【问题描述】:

我编写了一个小的 python 包,它通过一些额外的方法扩展了 pandas 数据框。

目前,我的包中有以下代码:

def init():
    @pd.api.extensions.register_dataframe_accessor("test")
    class _:
        def __init__(self, pandas_obj):
            self._obj = pandas_obj

        def myMethod(self):
            pass

然后我在 python 中执行以下操作:

import pandas as pd
import mypackage as mp
mp.init()
test = pd.Dataframe(<define data frame>)
test.mp.myMethod()

我的问题是,是否可以在 mypackage 中的 __init__.py 中进行 pandas 导入并注册访问器,这样一旦 mypackage 被导入,我就可以在没有 init() 步骤的情况下自动访问 mymethod?我目前的方法感觉有点笨拙......

【问题讨论】:

  • 您可以在__init__.py 中执行任何必要的操作来初始化包。

标签: python pandas python-import class-extensions


【解决方案1】:

我可能在你的问题中遗漏了一些东西,但我认为你可能是在找错误的树。在这方面__init__.py 没有什么特别之处——你在__init__.py 中写的任何东西都会在你导入包时执行,所以我认为你根本不需要init() 函数。如果您的文件包含:

# mypackage/__init__.py
import pandas as pd


@pd.api.extensions.register_dataframe_accessor("test")
class _:
    def __init__(self, pandas_obj):
        self._obj = pandas_obj

    def myMethod(self):
        print(self._obj)

现在您可以通过导入 mypackage 来使用它,例如:

>>> import pandas as pd
>>> import mypackage
>>> df = pd.DataFrame({'a': [1, 2, 3]})
>>> df.test.myMethod()
   a
0  1
1  2
2  3

顺便说一句,您可能明确想要类似init() 函数的一个原因是最不意外的原则:因为register_dataframe_accessor 修改了所有用户的DataFrame 实例的命名空间(包括其他库)您的register_dataframe_accessor 很可能会通过导入您的包来覆盖其他包的数据帧访问器(如果它们碰巧共享相同的名称)。

如果名称相当独特,这可能不是问题。它也可能对您的包来说根本不是问题,具体取决于它的使用方式。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2015-01-18
    • 2017-05-17
    • 1970-01-01
    • 2020-08-01
    • 2013-08-18
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多