我正在用Python编写一个程序来打开输入文件,进行一些简单的文本解析和输出。输入是一个ASCII文件,带有几个类似格式的文本块。所以,我认为我会利用这个机会来定义我自己的类。
我有一个父类pFrame
,我希望继承pandas.DataFrame
类的属性。由于我的输入文本文件包含两种类似(但不完全相同)的列式文本,因此我定义了两个继承父类的其他类(pFrameA
和pFrameB
)。目前,子类只是初始化了一些变量;之后我可以根据需要为一个,另一个或两个类定义简单的辅助方法。
这是我为定义这些类而编写的模块的精简版本:
import pandas as pd
class pFrame(pd.DataFrame):
pass
class pFrameA(pFrame):
def __init__(self):
self.units = ('msec', 'psi')
self.numFormat = (int, float)
self._gcHeaderStr = " Time Cell"
class pFrameB(pFrame):
def __init__(self):
self.units = ('in', 'in')
self.numFormat = (float, float)
self._gcHeaderStr = "Disp 1 Disp 2"
但是当我尝试测试这些类定义时,Python会进入无限的递归循环:
>>> import pFrameModule
>>> p=pFrameModule.pFrameA()
...
...
if name in self.columns:
File "properties.pyx", line 55, in pandas.lib.AxisProperty.__get__ (pandas/lib.c:29248)
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 2085, in __getattr__
if name in self.columns:
File "properties.pyx", line 55, in pandas.lib.AxisProperty.__get__ (pandas/lib.c:29248)
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 2085, in __getattr__
if name in self.columns:
File "properties.pyx", line 55, in pandas.lib.AxisProperty.__get__ (pandas/lib.c:29248)
RuntimeError: maximum recursion depth exceeded
有人能给我一个快速指针来了解我所缺少的东西吗?
答案 0 :(得分:2)
将代码修改为以下内容似乎可以解决问题:
import pandas as pd
class pFrame(pd.DataFrame):
def __init__(self):
super(pFrame, self).__init__()
class pFrameA(pFrame):
def __init__(self):
super(pFrameA, self).__init__()
self.units = ('msec', 'psi')
self.numFormat = (int, float)
self._gcHeaderStr = " Time Cell"
class pFrameB(pFrame):
def __init__(self):
super(pFrameB, self).__init__()
self.units = ('in', 'in')
self.numFormat = (float, float)
self._gcHeaderStr = "Disp 1 Disp 2"
p = pFrameA()
print p._gcHeaderStr # To prove something is happening
我怀疑通过忽略每个构造函数中对super
的调用,你没有正确初始化DataFrame类,导致它在幕后中断。