Python 从现有类构建类

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):

我正在尝试从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):
        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
),因此它不会改变任何东西,除非通过最初构建它的方式。