【问题标题】:How to create multiple instances of a same class and pass different arguments in Python如何在 Python 中创建同一个类的多个实例并传递不同的参数
【发布时间】:2020-10-16 09:26:56
【问题描述】:

我正在尝试创建一个函数来创建类 Comparer 的 4 个实例。类 Comparer 将相互比较两个 csv 文件。 因此,在创建实例时我需要传递不同的

我有这样的课:

class Comparer:
    def __init__(
        self
        , file1
        , file2
        , key_column):
    
    self.file1 = file1 
    self.file2 = file2
    self.key_column = key_column 

    # Read in the two files
    file1 = pd.read_csv(self.file1)
    file2 = pd.read_csv(self.file2)

    def compare():
        pass 
     

我会像这样创建一个实例并传递参数

comparison1 = Comparer(
    file1 = "xyz/file1.csv",
    file2 = "xyz/file2.csv",
    key_col = 'col1')

comparison1.compare()    

但是,我更愿意在一个循环中创建多个实例或其他高效的方法。我认为可以通过以下方式完成。

LIST = [comparison1, comparison2, comparison3, comparison4]

objects = [Comparer() for i in LIST]
for obj in objects:
    other_object.add(obj)   

但是,我不知道如何更改它以便能够为比较所需的不同数据集传递不同的参数(正确 .csv 的路径)。

有人有想法吗?

【问题讨论】:

    标签: python pandas csv class


    【解决方案1】:

    您可以尝试定义比较元数据:

    comparison_metadata= [
        {
            'file1':'xyz/file1a.csv',
            'file2':'xyz/file2a.csv',
            'key_column':'col1a'
        },
        {
            'file1':'xyz/file1b.csv',
            'file2':'xyz/file2b.csv',
            'key_column':'col1b'
        },
    ]
    

    然后:

    comparers = [Comparer(metadata['file1'], metadata['file2'], metadata['key_column']) for metadata in comparison_metadata]
    

    验证检查:

    print(comparers[1].file1)
    print(comparers[1].file2)
    print(comparers[1].key_column)
    
    xyz/file1b.csv
    xyz/file2b.csv
    col1b
    

    【讨论】:

      【解决方案2】:
      class Comparer:
          def __init__(self, file1, file2, key_column):
      
              self.file1 = file1 
              self.file2 = file2
              self.key_column = key_column 
      
              # Read in the two files
              file1 = self.file1
              file2 = self.file2
      
          def compare(self):
              pass
           
      
      comparer_data = {
          0: ["xyz/file1.csv", "xyz/file2.csv", "key1"],
          1: ["abc/file1.csv", "abc/file2.csv", "key2"]
      }
      
      comparers = [Comparer(file1= comparer_data[i][0], file2= comparer_data[i][1], key_column= comparer_data[i][2]) for i in comparer_data]
      

      【讨论】:

        【解决方案3】:
        many_args = [
            ["a/file1.csv", "a/file2.csv", "key2"],
            ["b/file1.csv", "b/file2.csv", "key2"],
            ["c/file1.csv", "c/file2.csv", "key2"],
        ]
        
        comparers = [Comparer(*args) for args in many_args]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-28
          • 1970-01-01
          • 2022-07-21
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 2016-04-01
          • 1970-01-01
          相关资源
          最近更新 更多