blu*_*e13 1 python inheritance copy-constructor
我已经定义了一个NewDataStructure继承自另一个类的子类.作用于对象本身的方法可以正常使用此子类.但是,创建副本的方法,返回父类的对象,而不是子类.当我在其他方法中调用该方法时,这会导致很多问题.
有没有办法专门指示父类的命名方法应该返回子类的对象?
有没有办法指示所有继承的方法应该返回子类的对象,而不是父类?
也许我可以将返回的对象传递给__init__我的类的函数?我需要相应地修改我__init__...... Pythonic的方法是什么?
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'>
Run Code Online (Sandbox Code Playgroud)
我担心我认为你的问题是一个经典的XY问题,你问的是如何做Y你认为是X的解决方案,而实际上它不是X的一个很好的解决方案,可能更好的方法是尝试另一个解决方案到X.
X大致是"我如何将额外的功能绑定到DataFrame?",正如@ppkt所指出的,这个问题在这个问题中讨论过.提到的子类化的主要问题是你正在使用的那个,该类具有生成类的新实例的工厂方法,但这通常不能从子类中轻松操作.
但是,看看熊猫代码似乎有一个你可以使用的黑客.本DataFrame类定义了一个_constructor属性:
class DataFrame(NDFrame):
...
@property
def _constructor(self):
return DataFrame
Run Code Online (Sandbox Code Playgroud)
这似乎用于创建实例而不仅仅是DataFrame.因此,您可以通过覆盖子类上的该属性来解决您的问题:
class NewDataStructure(pd.DataFrame):
...
@property
def _constructor(self):
return NewDataStructure
Run Code Online (Sandbox Code Playgroud)
这是将实例创建推迟到可由用户修改的工厂/构造函数方法的公认模式.与日志记录模块设置记录器类的能力类似logging.setLoggerClass().
但据我所知,这是一件无证件事,所以你自担风险.即使它确实有效,从长远来看,你可能会更好地阅读更多关于构图与继承和尝试构图解决方案的内容.