你好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()...,而是想直接调用它。
答案 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
。