Python 是否可以从_uinit_uu.py扩展类
我已经编写了一个小型python包,它使用一些附加方法扩展了pandas数据框架 目前,我的软件包中有以下代码:Python 是否可以从_uinit_uu.py扩展类,python,pandas,python-import,class-extensions,Python,Pandas,Python Import,Class Extensions,我已经编写了一个小型python包,它使用一些附加方法扩展了pandas数据框架 目前,我的软件包中有以下代码: def init(): @pd.api.extensions.register_dataframe_accessor("test") class _: def __init__(self, pandas_obj): self._obj = pandas_obj def myMethod(self):
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()
将熊猫作为pd导入
将mypackage作为mp导入
mp.init()
test=pd.Dataframe()
test.mp.myMethod()
我的问题是,是否可以从mypackage中的
\uuuu init\uuuu.py
中导入并注册访问者,以便导入mypackage后,我可以自动访问mymethod,而无需执行init()步骤?我目前的方法有点笨拙…我可能在你的问题中遗漏了一些东西,但我认为你可能找错了方向。在这方面,\uuuu init\uuuuuuuuuupy
没有什么特别之处——您在\uuuu init\uuuuuuuuuuuupy
中编写的任何内容都会在导入包时执行,因此我认为您根本不需要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\u dataframe\u accessor
为所有用户(包括其他库)修改dataframe
实例的命名空间如果您的register\u dataframe\u访问器
,仅通过导入您的包,可能会覆盖其他包的dataframe访问器(如果它们恰好共享相同的名称)
如果名称是合理唯一的,那么这可能不是问题。根据使用方法的不同,这对您的软件包来说也可能不是问题。您可以在\uuuu init\uuuuuuuuuuy.py
中执行任何必要的操作来初始化软件包。