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

运行并返回Python类构造函数中类函数的值,python,pandas,initialization,init,Python,Pandas,Initialization,Init,大家好,。。。 我希望这个问题还没有得到回答。 在谷歌搜索了半天之后,我真的忍不住在这里问了一个问题。 我的问题如下: 我想创建一个类,它获取一些信息并处理这些信息: #Klassendefinition für eine Instanz von Rohdaten class raw_data(): def __init__(self, filename_rawdata, filename_metadata, file_format, pa

大家好,。。。 我希望这个问题还没有得到回答。 在谷歌搜索了半天之后,我真的忍不住在这里问了一个问题。 我的问题如下:

我想创建一个类,它获取一些信息并处理这些信息:

    #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方法有一个问题,我希望在实例化类时,在默认情况下运行下面的class方法,但是我无法设法使其正常工作。我在这里看到过其他一些帖子,比如[[1]: 第一个问题对我来说确实有效,但我想在构造函数运行后调用实例变量

我试过这个:

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()…对于每个实例,但更希望直接调用它。

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

自动生成的
\uuuuuu init\uuuuu
方法将为您设置四个已定义的属性。
\uuuuuu post\u init\uuuuu
将在
\uuuuuuu init\uuuuuuuuu
之后调用
\uuuuuuuuuuuuuuuuuuuuuuuuuu init
,使您有机会对两个给定的文件名调用
getDF
作为旁白,
raw\u data.getDF
可以简化为
return pd.DataFrame.from\u dict(dict(enumerate(self.parse(filename))
或(我认为)
return pd.DataFrame.from\u记录(enumerate(self.parse(filename)))
。此外,无论是
parse
还是
getDF
都不需要是类的方法;它们可以定义为类外的常规函数,或者,如果您真的想将它们保留在类的命名空间中,则可以被定义为静态方法。啊,见鬼,我确实查看了代码x次,但不知何故没有发现我缺少“.self”函数之前:-(很抱歉我这么做很愚蠢。以前从未听说过这个“数据类”,这让我大开眼界,非常感谢!!