扩展Python类的正确方法

时间:2018-06-29 19:13:02

标签: python pandas class inheritance

我希望扩展Panda的DataFrame,创建一个所有原始DataFrame属性/方法都完好无损的对象,同时提供一些新的属性/方法。我还需要能够将已经是DataFrames的对象转换(或复制)到我的新类中。我的工作似乎可行,但是我觉得自己可能违反了一些基本约定。这是执行此操作的正确方法,还是我应该首先执行此操作?

import pandas as pd

class DataFrame(pd.DataFrame):
    def __init__(self, df):
        df.__class__ = DataFrame # effectively 'cast' Pandas DataFrame as my own

然后我可以直接从Pandas DataFrame初始化它的想法,例如:

df = DataFrame(pd.read_csv(path))

3 个答案:

答案 0 :(得分:1)

如果您只想在DataFrame上添加方法,请先运行猴子补丁,然后再执行以下任何操作。

>>> import pandas                                
>>> def foo(self, x):                            
...     return x                                 
...                                              
>>> foo                                          
<function foo at 0x00000000009FCC80>             
>>> pandas.DataFrame.foo = foo                   
>>> bar = pandas.DataFrame()                     
>>> bar                                          
Empty DataFrame                                  
Columns: []                                      
Index: []                                        
>>> bar.foo(5)                                   
5                                                
>>>

答案 1 :(得分:1)

如果必须的话,我可能会这样做:

import pandas as pd

class CustomDataFrame(pd.DataFrame):
    @classmethod
    def convert_dataframe(cls, df):
        df.__class__ = cls
        return df

    def foo(self):
        return "Works"


df = pd.DataFrame([1,2,3])
print(df)
#print(df.foo())    # Will throw, since .foo() is not defined on pd.DataFrame

cdf = CustomDataFrame.convert_dataframe(df)
print(cdf)
print(cdf.foo())    # "Works"

注意:这将永久更改您传递给convert_dataframe的df对象:

print(type(df))     # <class '__main__.CustomDataFrame'>
print(type(cdf))    # <class '__main__.CustomDataFrame'>

如果您不想这样做,可以将数据框复制到类方法中。

答案 2 :(得分:0)

if __name__ == '__main__':
    app = DataFrame()
    app()

事件

super(DataFrame,self).__init__()