如何避免使用组合对 Pandas DataFrame 进行子类化?

问题描述

pandas 文档 recommends against 对其数据结构进行了子分类。他们推荐的替代方案之一是使用组合,但他们只是将读者引向维基百科关于组合与继承的文章。我发现的那篇文章和其他资源并没有帮助我理解如何使用组合扩展 pandas DataFrame。有人可以在这种情况下解释组合并告诉我组合可能是子类 pd.DataFrame 的首选替代方案的情况吗?一个简单的例子或比维基百科文章更有指导意义的信息链接会非常有帮助。

在这个问题中,我特别询问在有人可能想要子类化 pd.DataFrame 的情况下,应该如何使用组合。我知道还有其他不涉及组合的扩展 Python 对象的解决方案,我询问 another question 关于扩展 pandas DataFrames 导致使用包装类的不同解决方案。>


我不明白“包装”和“组合”在这里指的是相同的方法,如下面 MaxYarmolinsky 的回答所述。我上面链接到的问题的 answer在这种情况下使用组合进行了更完整的讨论,这可能需要正确处理 __getattr____getitem____setitem__(我意识到这对于知道自己在做什么的人来说是显而易见的,但我不得不问我之前的问题,因为我自己尝试时未能获取/设置项目)。

解决方法

只需通过谷歌搜索向您展示如何创建一个简单的类,正如您通过组合描述的那样。

  class mydataframe():
      def __init__(self,data):
          self.coredataframe = pd.DataFrame(data)
          self.otherattribute = None

然后就可以添加自己的方法和属性了...

,

在 OOP 继承模型中,一种“is-a”关系,其中组合模型“has-a”。

一般来说,除非您有特定的多态设计,否则您应该使用组合而不是继承,因为它不那么紧密耦合并且更加模块化。继承是你能做到的最强耦合。强耦合导致维护困难(一切都连接起来,很难分离),而组合更容易重构。

如果不注意设计或设计是增量的,继承也会导致混乱的继承层次结构。

也就是说不要害怕使用继承来实现多态。但要小心将其用于简单的代码重用。