繁体   English   中英

如何获得子类以返回其自身的副本,而不是其继承自的父类?

[英]How can I get a subclass to return a copy of itself, rather than the parent class it is inheriting from?

我定义了一个继承自另一个类的NewDataStructure子类。 作用于对象本身的方法可以与此子类一起正常工作。 但是,创建副本的方法返回的是父类的对象,而不是子类的对象。 当我在其他方法中调用该方法时,这会导致很多问题。

有没有一种方法可以特别指示父类的命名方法应返回子类的对象?

有没有一种方法可以指示所有继承的方法都应返回子类的对象,而不是父类的对象?

也许我可以将返回的对象传递给类的__init__函数? 我需要相应地修改__init__ ……Python的方式是什么?

import pandas as pd


class NewDataStructure(pd.DataFrame):
    def __init__(self, data, index, title):
        super(NewDataStructure, self).__init__(data=data, index=index)
        self.title = title


new_data_variable = NewDataStructure(data=None, index=None, title="")

changed = new_data_variable.unstack()

new_data_variable.reset_index(inplace=True)
unchanged = new_data_variable

print type(changed)
print type(unchanged)

<class 'pandas.core.series.Series'> 
<class '__main__.NewDataStructure'>

恐怕我认为您的问题是一个经典的XY问题 ,您在问如何做Y,您认为这是对X的解决方案,而实际上这并不是对X的很好解决方案,可能更好的方法是尝试其他解决方案到X。

X大致是“如何将额外的功能绑定到DataFrame ?”,正如@ppkt指出的那样, 此问题已讨论。 提到的子类化的主要问题是,您遇到了一个问题,即该类具有产生该类新实例的工厂方法,但是通常您不能从子类中轻松地进行操作。

然而, DataFrame类提供了一个解决方案(这是官方为2019年6月,见文档 )通过_constructor属性:

class DataFrame(NDFrame):
    ...
    @property
    def _constructor(self):
        return DataFrame

可以用来创建实例,而不仅仅是DataFrame 因此,您可以通过覆盖子类上的该属性来解决您的问题:

class NewDataStructure(pd.DataFrame):
    ...
    @property
    def _constructor(self):
        return NewDataStructure

这是将实例创建推迟到可由用户修改的工厂/构造函数方法的一种公认的模式。 类似于日志记录模块使用logging.setLoggerClass()设置记录器类的功能。

我认为这里描述了相同的问题: Pandas DataFrame对象继承还是对象使用?

作为解决方案,您应该为Pandas DataFrame创建包装器类。

!!! 我在使用小型智能手机!

以您使用代码的方式,您正在实现对该函数的递归调用。

据我所知,您已经正确地创建了new_variable_data对象,但是您没有正确设计要调用的函数,除非它们是pandas的一部分,如果是这种情况,则必须为每个pd创建一个时间并重新分配。

至于不带任何参数传递的数据,您也要合并一个if语句,然后将数据作为对象分配给self。

我认为您可以做您想做的事情,您只需要稍微重新定义类并考虑对象设计即可。

我正在回家的路上,我将在使用笔记本电脑时为您进行编辑,并举一个例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM