Python 从现有类构建类
我正在尝试从pandas DataFrame构建一个类。我只想向DataFrame类添加一个属性“name”。但下面的代码在达到最大递归深度时会产生错误。哪种方法可以让它工作?谢谢Python 从现有类构建类,python,pandas,inheritance,Python,Pandas,Inheritance,我正在尝试从pandas DataFrame构建一个类。我只想向DataFrame类添加一个属性“name”。但下面的代码在达到最大递归深度时会产生错误。哪种方法可以让它工作?谢谢 import pandas as pd class DatFrame(pd.DataFrame): def __init__(self, name, data=None, index=None, columns=None, dtype=None, copy=False):
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)
错误:递归错误:调用Python对象时超出了最大递归深度首先,您要将
None
传递给数据帧的所有参数
其次,修复方法是在设置name
之前,首先调用\uuuu init\uuu
方法
这可能是因为pd.DataFrame
对象在初始化时需要一个空的变量字典(递归发生在\uuuu getattr\uuuuu
中),而您的名称
成员混淆了它:
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
正如您所知,您可以动态地向Python对象添加属性。因此,假设您有一个由变量
df
引用的pd.DataFrame
,那么您只需执行df.name='huy'
,另外,在对pandas
数据结构进行子类化时,还有一些特殊的注意事项。是的,当你想添加属性时,我可以看到子类化的优点,在这种情况下,因为子类化pd.Dataframe
是非常重要的,我可能只使用动态属性。当然,看看递归错误的堆栈跟踪,在属性和名称上有一些魔力,这是有意义的,因为您可以通过名称作为数据帧中的属性访问列。拥有一个非空的\uuuu dict\uuuu
肯定会搞乱正在进行的任何复杂初始化。@juanpa.arrivillaga AFAIK子类化以添加属性或动态添加属性具有相同的效果。类\uuuu dict\uuuu
是更新的(外部或内部\uuuuu init\uuuuu
),因此它不会改变任何东西,除非通过最初构建它的方式。