【问题标题】:Run and return value of class function inside __init__ Python Class Constructor在 __init__ Python 类构造函数中运行并返回类函数的值
【发布时间】:2019-02-26 15:19:45
【问题描述】:

大家好 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() 那样重复每个实例,而是希望直接调用它。

【问题讨论】:

  • self.getDF(...)
  • 顺便说一句,raw_data.getDF 可以简化为 return pd.DataFrame.from_dict(dict(enumerate(self.parse(filename)))) 或(我认为)return pd.DataFrame.from_records(enumerate(self.parse(filename)))
  • 另外,parsegetDF 都不需要是你的类的方法;它们可以定义为类外的常规函数​​,或者,如果您真的想将它们保留在类的命名空间中,则可以将它们设为静态方法。

标签: python pandas initialization init


【解决方案1】:

您只需要像任何其他方法一样调用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

【讨论】:

  • 啊该死,我确实看过代码 x 次,但不知何故没有看到我错过了函数之前的“.self”:-( 抱歉,这对我来说很愚蠢。从未听说过这个“数据类”之前,这让我大开眼界,非常感谢!!
猜你喜欢
  • 2011-10-14
  • 2015-06-30
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2012-02-17
  • 2015-07-08
相关资源
最近更新 更多