[英]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.