python - 从现有的类构建一个类

标签 python pandas inheritance

我正在尝试从 pandas DataFrame 构建一个类。我只想向 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 对象时超出最大递归深度

最佳答案

首先,您将 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

关于python - 从现有的类构建一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382585/

相关文章:

python - Tornado 调度程序

python - 根据其他列的 groupby 为列设置值

java - 在子类中隐藏方法

c# - 在不同的命名空间 C# 中重写方法

Python:如何获取多行输入数据并将其放入列表中

python - 删除长度超过 x 个字符的字符串的所有副本(正则表达式?)

python - 为什么我的生成器函数总是返回相同的值?

python - 在 python 中使用 sqlalchemy 和 pandas 构建具有可变长度列表的 SQL 查询

python - 如何删除具有混合类型列的 Pandas Dataframe 中所有数字列都包含零的行?

swift - 在通用元类型函数中返回具有特定元类型的对象