pandas 将示例变量从一个类传递到另一个类而不调用第一个类方法

mwngjboj  于 2023-03-16  发布在  其他
关注(0)|答案(2)|浏览(109)

我有一个包含多个类的Python模块,其中第一个类执行大量的数据导入,接下来的几个类基于第一个类的输出创建文件:

class ImportData:
   def __init__(self):
      self.result_csv = None
   def import_file(self):
      self.result_csv = pd.read_csv(file.csv)
      return self.result_csv 

class CreateDataObject1:
   def __init__(self):
      import_data = ImportData()
      self.data_object_1 = import_data.result_csv
   def create(self):
      self.data_object_1 = self.data_object_1.loc[self.data_object_1["Zulu"]]

class CreateDataObject2:
   def __init__(self):
      import_data = ImportData()
      self.data_object_2 = import_data.result_csv
   def create(self):
      self.data_object_2 = self.data_object_2.loc[self.data_object_2["Foxtrott"]]

如您所见,我希望将示例变量从第一个类传递到所有其他类,以便它们可以进一步使用它,但是,我不希望每次都调用第一个类中的import方法,因为它的计算开销很大。2我怎样才能保证后面所有的类只从第一个类中获取结果示例变量而不调用它的方法呢?这里是否推荐使用静态方法/类方法/类继承?谢谢!

xzlaal3s

xzlaal3s1#

使用依赖注入。不要示例化ImportData并在每个类中调用它,而是将data_object作为构造函数的参数提供。
应用程序的主体负责按正确的顺序将所有对象组合在一起,并且可以确定是为每个依赖项使用新对象还是重用它们。

class ImportData:
   def __init__(self, file):
      self.result_csv = pd.read_csv(file.csv)

class CreateDataObject1:
   def __init__(self, data_object):
      self.data_object_1 = data_object.loc[data_object["Zulu"]]

class CreateDataObject2:
   def __init__(self, data_object):
      self.data_object_2 = data_object.loc[data_object["Foxtrott"]]

...

if __name__ == "__main__":
    import_data = ImportData(file)
    data_object = import_data.result_csv
    obj1 = CreateDataObject1(data_object)
    obj2 = CreateDataObject2(data_object)
s1ag04yj

s1ag04yj2#

你的问题有很多解决办法我认为一个带有自定义方法的类要简单一些:

class ImportData:
   def __init__(self, file):
      self.df = pd.read_csv(file)
      self.data_object1 = None
      self.data_object2 = None

   def create_object1(self):
      self.data_object1 = self.df.loc[self.df["Zulu"]]

   def create_object2(self):
      self.data_object2 = self.df.loc[self.df["Foxtrott"]]

注意,你基本上只是在一个类中组合一个 Dataframe ,并添加一些(硬编码的)方法,也许你只是想要 Dataframe ,并在需要时调用df.loc[df["Foxtrott"]]

相关问题