我怎样才能获得子 class 到 return 自身的副本,而不是它继承自的父 class?

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

我定义了一个继承自另一个 class 的子class NewDataStructure。作用于对象本身的方法与这个 subclass 一起工作得很好。但是,创建副本 return 父对象 class 而不是子对象 class 的方法。当我在其他方法中调用该方法时,这会导致很多问题。

有没有办法明确指示父 class 的命名方法应该 return 子 class 的对象?

有没有办法指示所有继承的方法都应该return子class的对象,而不是父class的对象?

也许我可以将 returned 对象传递给 class 的 __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'>

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

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

恐怕我认为你的问题是 classic XY question,你在问如何做你认为是 X 的解决方案的 Y,但实际上它不是一个很好的解决方案到 X 并且可能更好的方法是尝试对 X 的另一种解决方案。

X 大致是 "how do I bind extra functionality on to DataFrame?",正如@ppkt 指出的那样,这在 this question 中进行了讨论。提到的 subclassing 的主要问题是你遇到的问题,即 class 具有生成 class 新实例的工厂方法,但这不是你要解决的问题通常可以从 subclass.

轻松操作

然而,DataFrame class 提供了一个解决方案(截至 2019 年 6 月是官方的,请参阅 documentation) via the _constructor 属性:

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

可用于创建实例而不仅仅是 DataFrame。因此,您可以通过覆盖 subclass:

上的 属性 来解决您的问题
class NewDataStructure(pd.DataFrame):
    ...
    @property
    def _constructor(self):
        return NewDataStructure

这是一种公认​​的将实例创建推迟到用户可以修改的工厂/构造方法的模式。类似于 logging 模块设置 logger class 和 logging.setLoggerClass() 的能力。

!!!我在小聪明phone !!!

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

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

至于数据作为使用 none 传递的参数,您可能还想合并一个 if 语句,然后将数据作为对象分配给自己。

我认为你可以做你想做的事,你只需要稍微重新分配 class 并考虑对象设计。

我正在回家的路上,我会在我的笔记本电脑上为你编辑这个,并给你举个例子 .