2013-07-17 2 views
2

Я пытаюсь создать панда Dataframe как класс с некоторыми дополнительными конструкторами:Pythonic способа расширения базового класса

class ExtendedDataFrame(DataFrame): 
    def __init__(self): 
     super(ExtendedDataFrame, self).__init__() # without this I get a pandas error 

    @classmethod  
    def contructor1(cls, filename): 
     "Create DataFrame from file" 
     df = pd.read_csv(filename) # returns a DataFrame 
     df.__class__ = cls 
     return df 

    # more methods extending Dataframe ... 

Так что теперь я могу сделать:

ExtendedDataFrame.constructor1('table_xx.txt') # returns an ExtendedDataFrame instance 

Что я хотел бы должен иметь возможность получить экземпляр моего класса таблицы таким образом:

ExtendedDataFrame('table_xx.txt') 

Каков рекомендуемый способ для этого?

Другими словами, я пытаюсь сделать ExtendedDataFrame класс, но методы некоторых панд как read_csv возвратной DataFrame, и я хочу, чтобы иметь ExtendedDataFrame вернулся.

+0

Что именно вы пытаетесь достичь? Почему бы просто не сказать, что 'Table = pd.read_csv' и использовать это? –

+1

Я планирую использовать pd.read_csv или pd.read_fwf в зависимости от аргументов (типа имени файла), переданных во время построения, я также планирую расширить класс другими методами. – elyase

+0

Если речь идет только о различии имени файла, сделайте это извне или определите простую функцию, которая возвращает фрейм данных. Для чего вам нужен класс «Таблица», за исключением различия между форматами входных данных? –

ответ

0

Используйте расширение аргументов в вашем методе __init__, исследуйте предоставленные аргументы и если вы найдете один строковый аргумент, затем выполните команду Table.constructor1('string') внутри.

С другой стороны, если вы внимательно изучите свой вопрос, мне интересно, чего вы хотите достичь здесь. До сих пор ваш класс не имеет смысла. Какую функциональность вы хотите реализовать, чтобы вам не хватило df = pd.read_csv(...)?

+0

Вы могли бы прояснить 'выполнить Table.constructor1 (' string ') внутренне'? – elyase

+0

Это просто пример, на практике я планирую использовать read_csv или read_fwf в зависимости от аргументов, переданных конструктору, плюс добавить некоторый метод, специфичный для моей проблемы. – elyase

+0

В рамках метода init вашего класса, то есть во внутренних компонентах вашего класса, так что он не является частью интерфейса. –

Смежные вопросы