Py学习  »  Python

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

BayerischerSchweitzer • 5 年前 • 1941 次点击  

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52599
文章 [ 1 ]  |  最新文章 5 年前
chepner
Reply   •   1 楼
chepner    6 年前

你只要打个电话 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__ 将被调用 之后 __初始__ ,给你打电话的机会 getDF公司 在两个给定的文件名上。