【问题标题】:How do I avoid subclassing a pandas DataFrame using composition?如何避免使用组合子类化 pandas DataFrame?
【发布时间】:2020-12-20 17:48:33
【问题描述】:

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

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


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

【问题讨论】:

    标签: python python-3.x pandas class subclassing


    【解决方案1】:

    只是一些谷歌搜索向您展示如何通过组合来创建一个简单的类。

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

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

    【讨论】:

    • 那么合成和“包装”是一回事吗?
    • 是的,合成是所谓的“包装”的一个例子。我不确定“包装”是否有严格的定义,它是一个更笼统的概念。
    【解决方案2】:

    在 OOP 继承模型中,组合模型“具有”的“is-a”关系。

    一般而言,除非您考虑到特定的多态设计,否则您应该使用组合而不是继承,因为它的耦合度较低且模块化程度较高。继承是你能做到的最强耦合。强耦合会导致维护困难(所有东西都是连接的,难以分离),而组合更容易重构。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 2019-08-30
      • 2021-03-03
      • 2022-01-24
      • 2021-07-24
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多