在不调用第一类方法的情况下将实例变量从一个类传递到另一个类

问题描述 投票:0回答:2

我有一个由多个类组成的 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 方法,因为它的计算量很大。我如何确保所有后续类只从第一个类中获取结果实例变量而不调用其方法?在这里使用静态方法/类方法/类继承是否值得推荐?谢谢!

python pandas oop variables instance
2个回答
1
投票

使用依赖注入。与其实例化

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)

0
投票

您的问题有多种解决方案;我认为一个带有自定义方法的类更简单一些:

class ImportData:
   def __init__(self, file.csv):
      self.df = pd.read_csv(file.csv)
      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"]]

请注意,您基本上只是在类中组合数据框并添加一些(硬编码)方法。也许您只想要数据框并根据需要调用

df.loc[df["Foxtrott"]]

© www.soinside.com 2019 - 2024. All rights reserved.