我正在尝试从pandas DataFrame构建一个类。我只是想添加一个属性' name'到DataFrame类。但是下面的代码会产生递归最大深度误差。哪种方式可以使它工作?感谢
import pandas as pd
class DatFrame(pd.DataFrame):
def __init__(self, name, data=None, index=None, columns=None,
dtype=None, copy=False):
self.name = name
pd.DataFrame.__init__(self, data=None, index=None,
columns=None, dtype=None, copy=False)
x = array([[9, 7, 5],
[7, 3, 1],
[8, 8, 3],
[7, 4, 3]])
cols = ['a', 'b', 'c']
index = ['D', 'E', 'F', 'G']
s = DatFrame('huy', x, index, cols)
错误:RecursionError:调用Python对象时超出了最大递归深度
答案 0 :(得分:5)
首先,您将None
传递给数据框的所有参数
其次,修复是在设置__init__
之前先调用name
方法。
这可能是因为pd.DataFrame
对象在初始化时需要一个空变量字典(在__getattr__
中发生递归),而你的name
成员会混淆它:
class DatFrame(pd.DataFrame):
def __init__(self, name, data=None, index=None, columns=None,
dtype=None, copy=False):
pd.DataFrame.__init__(self, data=data, index=index,
columns=columns, dtype=dtype, copy=copy)
self.name = name
作为一般规则,首先调用父构造函数总是更好,然后设置你的细节。
正如评论所说,如果仅添加name
(不添加方法),您可以创建一个动态添加属性的工厂方法,无需继承:
def create_datframe(name,*args,**kwargs):
r = pd.DataFrame(*args,**kwargs)
r.name = name
return r