簡體   English   中英

Python通過方法鏈接保留子類

[英]Python retain subclass with method chaining

我定義了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))

但是數據幀有很多這樣的數據,我不想為每個數據幀手動執行此操作。

我以為可能有一種方法可以應用一些包裝每個父方法的裝飾器,但是我不確定該怎么做或它是否正確。

對於子類繼承返回父實例的方法的所有情況,此問題都是普遍的。

有人知道如何解決此問題嗎?

感謝@ayhan為我指出正確的方向。 我遵循了此文檔的注釋, 注釋顯示了如何專門在熊貓中完成子類化。 解決方法是:

class MySpecialDF(pd.DataFrame):

    @property
    def _constructor(self):
        return MySpecialDF

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

我不知道這是否解決了子類繼承返回父實例的方法的普遍問題。 但是,我不能肯定可以有一個通用的解決方案,作為返回的情況下,可以任意構造。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM