如何让子类返回自身的副本,而不是它继承的父类?

时间:2017-02-22 10:37:56

标签: 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'>

3 个答案:

答案 0 :(得分:7)

我担心我认为你的问题是经典的XY question,你问的是如何做你认为是X解决方案的Y,而实际上它并不是一个很好的解决方案。 X和可能更好的方法是尝试X的另一种解决方案。

X大致是&#34;如何将额外的功能绑定到DataFrame?&#34;,并且正如@ppkt指出的那样,这在this question中讨论。子类化中提到的主要问题是你正在使用的那个,该类具有生成类的新实例的工厂方法,但这通常不能从子类中轻松操作。

然而,看看熊猫代码似乎有一个你可以使用的黑客。 DataFrame class defines a _constructor property

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

似乎用于创建实例而不仅仅是DataFrame。所以你可能能够通过覆盖你的子类上的那个属性来解决你的问题:

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

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

但据我所知,这是一件无证件事,所以你自担风险。即使它确实有效,从长远来看,你可能会更好地阅读有关构图与继承以及尝试构图解决方案的更多内容。

答案 1 :(得分:1)

我认为这里描述了同样的问题:Pandas DataFrame Object Inheritance or Object Use?

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

答案 2 :(得分:0)

!!!我在小巧的智能手机上!

以您使用代码的方式,您正在实现对函数的重复调用。

到目前为止,我可以告诉你,你创建了new_variable_data对象,但你没有正确设计你正在调用的函数,除非它们是pandas的一部分,如果是这种情况,你必须创建一个for pd每次都重新分配。

对于作为参数的数据传递时,您也希望合并一个if语句,然后将数据作为对象分配给self。

我认为你可以做你想做的事情,你只需要重新设计一下这个类,并考虑一下对象设计。

我正在回家的路上,当我上笔记本电脑时,我会为你编辑这个,给你一个例子 。