在__init__ Python类构造函数中运行并返回类函数的值

时间:2019-02-26 15:19:46

标签: python pandas initialization init

你好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方法有问题,我想在实例化类时默认情况下运行下面的类方法,但是我不知何故无法正常工作。我在这里还看到了其他几篇文章,例如[Calling a class function inside of __init__ [1]:Python 3: Calling a class function inside of __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 :(得分:0)

您需要做的就是像使用任何其他方法一样调用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