我怎样才能获得子 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 并考虑对象设计。
我正在回家的路上,我会在我的笔记本电脑上为你编辑这个,并给你举个例子
.
我定义了一个继承自另一个 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 并考虑对象设计。
我正在回家的路上,我会在我的笔记本电脑上为你编辑这个,并给你举个例子 .