Pandas DataFrame对象继承还是对象使用?

san*_*tle 8 python oop inheritance pandas

我正在构建一个用于处理非常具体的结构化数据的库,我正在Pandas之上构建我的基础架构.目前,我正在为不同的用例编写一堆不同的数据容器,例如CTMatrix for Country x Time Data等,以容纳适用于所有CountryxTime结构化数据的方法.

我目前正在辩论

选项1:对象继承

class CTMatrix(pd.DataFrame):
    methods etc. here
Run Code Online (Sandbox Code Playgroud)

或选项2:对象使用

class CTMatrix(object):
    _data = pd.DataFrame

    then use getter, setter methods to control access to _data etc. 
Run Code Online (Sandbox Code Playgroud)

从软件工程的角度来看,这里有一个明显的选择吗?

到目前为止我的想法是:

选项1:

  1. 可以直接在CTMatrix类(如CTmatrix.sort())上使用DataFrame方法,而不必通过_dataOption#2中封装对象上的方法支持它们
  2. 除了可能用本地类方法覆盖的方法之外,Pandas中的更新和新方法是继承的

但

  1. 使用某些方法的并发症,例如__init__()必须将属性传递给超类super(MyDF, self).__init__(*args, **kw)

选项2:

  1. 更多地控制Class及其行为
  2. Pandas的更新可能更具弹性?

但

  1. 必须使用getter()或非隐藏属性来使用对象,如数据框,如(CTMatrix.data.sort())

在选项#1中采用这种方法是否还有其他缺点?

Mat*_*ohn 5

我会避免子类化DataFrame,因为许多DataFrame方法将返回一个新的DataFrame而不是另一个CTMatrix对象的实例.

GitHub上存在一些未解决的问题,例如:

更一般地说,这是一个构成与继承的问题.我会特别警惕#2的好处.它现在看起来很棒,但除非你密切关注熊猫的更新(它是一个快速移动的目标),否则你很容易就会产生意想不到的后果,你的代码最终将与熊猫交织在一起.