如何用子类替换基类——即使基类方法返回新的基类实例



我有一个继承自pandas.DataFrame的子类,并为我的实现添加了一些新方法。这些方法作用于并返回self的修改版本(基本上只是重复已经存在的可链方法的DataFrame模式,但具有扩展的功能):

class Subclass(pandas.DataFrame):
def new_method(self):
return Subclass(self.transform(...))

当我定义自己的方法时,很容易返回新的Subclass实例。但是,当我从基类调用未被覆盖的方法时,返回的结果是一个新的DataFrame,而不是一个新的子类。因此,只要我使用基类方法,我就会失去实例中的任何新功能。

是否有一种方法(不重写每个方法在pandas.DataFrame基类中,我怀疑可能在子类中使用)强制基类方法返回子类实例?换句话说,只要在Subclass实例中使用DataFrame构造函数,就默默地将其替换为Subclass构造函数?

看一下文档,似乎有一个解决方案。

在你的类中,你需要重写这个属性并返回你自己的类。

@property
def _constructor(self):
return Sublclass

为了保持这种模式,您还应该在使用对_constructor的引用返回对象时替换任何Subclass调用,以便您自己类的任何子类也可以返回Subsubclass而不是Subclass

最新更新