【问题标题】:Python retain subclass with method chainingPython保留带有方法链接的子类
【发布时间】:2018-08-07 10:13:22
【问题描述】:

我已经定义了 pandas Dataframe 的一个子类。子类与数据框基本相同,但有额外的方法来完成专门的任务。

pandas 数据框最方便的属性之一是支持方法链接;也就是说,数据框方法返回数据框类的实例。

我希望能够使用这些方法,但是当我从子类调用它们时,我得到了父类的一个实例。

import pandas as pd

class MySpecialDF(pd.DataFrame):
    def sqrt(self, colname):
        return self[colname]**2.0

df = MySpecialDF({'a':[1,2,3], 'b':[4,5,6]})
df.sqrt('a') # all good!

df = df.drop('b', axis=1) # returns a regular DF
df.sqrt('a') # AttributeError: 'DataFrame' object has no attribute 'sqrt'

如何设置这些方法以使这些方法返回 子类 的实例?

我可以像这样手动覆盖单个方法:

class MySpecialDF(pd.DataFrame):
    def sqrt(self, colname):
        return self[colname]**2.0

    def drop(self, *args, **kwargs):
        return MySpecialDF(super(MySpecialDF, self).drop(*args, **kwargs))

但是 Dataframes 有很多 个,我不想为每个手动执行此操作。

我认为可能有一种方法可以应用一些装饰器来包装每个父方法,但我不确定如何执行此操作或者它是否是正确的方法。

这个问题对于子类继承返回父类实例的方法的所有情况都很普遍。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 我对此没有太多经验,但看起来 piRSquared 在this answer 中涵盖了这个。

标签: python pandas class oop inheritance


【解决方案1】:

感谢@ayhan 为我指明了正确的方向。我关注this documentation 的评论,它显示了如何在 pandas 中实现子类化。解决方法是:

class MySpecialDF(pd.DataFrame):

    @property
    def _constructor(self):
        return MySpecialDF

    def sqrt(self, colname):
        return self[colname]**2.0

我不知道这是否解决了子类继承返回父类实例的方法的一般问题。但是,我不确定是否有 通用解决方案,因为返回的实例可以任意构造。

【讨论】:

    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多