微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 从现有类构建类

我正在尝试从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)

错误:RecursionError:调用Python对象时超出了最大递归深度

解决方法:

首先,您将None传递给数据帧的所有参数

其次,修复它是在设置名称之前首先调用__init__方法.

这可能是因为pd.DataFrame对象在初始化时需要一个空变量字典(递归发生在__getattr__中),而你的名字成员会混淆它:

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

作为一般规则,首先调用父构造函数总是更好,然后设置您的细节.

正如评论所说,如果仅添加名称(不添加方法),您可以创建一个动态添加属性的工厂方法,无需继承:

def create_datframe(name,*args,**kwargs):
    r = pd.DataFrame(*args,**kwargs)
    r.name = name
    return r

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐