Выполнить и вернуть значение функции класса внутри __init__ конструктора классов Python - PullRequest
0 голосов
/ 26 февраля 2019

Привет, ребята из Stackoverflow, ... Надеюсь, на этот вопрос еще нет ответа.После полдня гуглинга я смирился с тем, чтобы задать вопрос здесь.Моя проблема заключается в следующем:

Я хочу создать класс, который принимает некоторую информацию и обрабатывает эту информацию:

    #Klassendefinition für eine Instanz von Rohdaten
class raw_data():   
    def __init__(self, filename_rawdata, filename_metadata,
                 file_format, path, category, df_raw, df_meta):
        self.filename_rawdata = filename_rawdata
        self.filename_metadata = filename_metadata
        self.file_format = file_format
        self.path = path
        self.category = category
        self.df_raw = getDF(self.filename_rawdata)
        self.df_meta = getDF(self.filename_metadata)

    # generator
    def parse(self, path):
        g = gzip.open(path, 'rb')
        for l in g:
            yield eval(l)

    # function that returns a pandas dataframe with the data
    def getDF(self, filename):
        i = 0
        df = {}
        for d in self.parse(filename):
            df[i] = d
            i += 1
        return pd.DataFrame.from_dict(df, orient='index')

Теперь у меня проблема с методом init, я хотел быЗапустите метод класса ниже по умолчанию, когда класс создан, но мне как-то не удается заставить это работать.Я видел несколько других постов, таких как [ Вызов функции класса внутри __init __ [1]: Python 3: Вызов функции класса внутри __init __ , но я все еще не могу сделатьЭто.Первый вопрос сработал для меня, но я хотел бы вызвать переменную экземпляра после запуска конструктора.

Я попробовал это:

class raw_data():   
    def __init__(self, filename_rawdata, filename_metadata,
                 file_format, path, category):
        self.filename_rawdata = filename_rawdata
        self.filename_metadata = filename_metadata
        self.file_format = file_format
        self.path = path
        self.category = category
        getDF(self.filename_rawdata)
        getDF(self.filename_metadata)

    # generator
    def parse(self, path):
        g = gzip.open(path, 'rb')
        for l in g:
            yield eval(l)

    # function that returns a pandas dataframe with the data
    def getDF(self, filename):
        i = 0
        df = {}
        for d in self.parse(filename):
            df[i] = d
            i += 1
        return pd.DataFrame.from_dict(df, orient='index')

Но я получаю ошибку, потому что getDF неопределено (очевидно) .. Я надеюсь, что этот вопрос не глупый ни в коем случае.Мне нужно сделать это таким образом, потому что после этого я хочу выполнять как 50-60 вызовов экземпляра, и я не хочу повторять, как Instance.getDF () ... для каждого экземпляра, а скорее хотел бы, чтобы он вызывался напрямую.

1 Ответ

0 голосов
/ 26 февраля 2019

Все, что вам нужно, это вызвать getDF, как и любой другой метод, используя self в качестве объекта, для которого он должен быть вызван.

self.df_raw = self.getDF(self.filename_rawdata)

Тем не менее, этот класс может быть значительно упрощенсделав его классом данных.

from dataclasses import dataclass

@dataclass
class RawData:
    filename_rawdata: str
    filename_metadata: str
    path: str
    category: str

    def __post_init__(self):
        self.df_raw = self.getDF(self.filename_rawdata)
        self.df_meta = self.getDF(self.filename_metadata)

    @staticmethod
    def parse(path):
        with gzip.open(path, 'rb') as g:
            yield from map(eval, g)

    @staticmethod
    def getDF(filename):
        return pd.DataFrame.from_records(enumerate(RawData.parse(filename)))

Сгенерированный автоматически метод __init__ установит для вас четыре определенных атрибута.__post_init__ будет называться после __init__, что даст вам возможность позвонить getDF по двум заданным именам файлов.

...