我正在构建一个脚本,用于处理来自不同提供程序的多个数据文件。由于每个文件的处理大致相同,因此我决定创建一个包含处理方法的父类“数据”。我认为这将使我的代码更加井井有条,并且,如果添加了新的数据源,则将其添加到脚本中很简单。
虽然每个文件都经过相同的处理,但是它们具有不同的详细信息-目录,文件格式,编码,列名等。每个文件具有相同的属性,但是它们的内容显然不同。这些属性没有变化,但是由于可能会有30个以上的属性,因此我希望能够在单独的模块中对它们进行硬编码,而不是将其作为参数传递给上述“ Data”类的新实例。
我的第一步虽然是为每个文件创建父“数据”类的子类。这些子类将在单独的模块中,并且具有硬编码的属性。下面是一个简化的示例:
import pandas as pd
class Data:
def read_in(self):
self.df = pd.read_csv(self.input_path, names = self.column_names)
def arbitrary_process(self):
# code interacting with self.df and other variables from Provider1/Provider2
def save(self):
pd.to_csv(self.output_path)
class Provider1(Data):
input_path = "provider1.txt"
column_names = ['A', 'B', 'C', 'D']
# more variables will be here...
output_path = "provider1_output.txt"
class Provider2(Data):
path = "provider2.txt"
column_names = ['E', 'F', 'G', 'H']
# more variables will be here...
output_path = "provider2_output.txt"
if __name__ == '__main__':
# processing...
data1 = Provider1
data2 = Provider2
data1.read_in()
data2.read_in()
data1.arbitrary_process()
data2.arbitrary_process()
data1.save()
data2.save()
立即采取行动,在父类中引用仅在子类中定义的属性的方法是不合适的。但是,由于大量的属性,我不确定将它们作为参数传递给父级的init方法是否是最佳选择。
我敢肯定,有一个解决问题的更优雅的方法,但是它并没有让我失望。一种可能的解决方案不必包括继承,但是我的主要目标是能够对将要处理的文件的详细信息进行硬编码。
谢谢!
答案 0 :(得分:1)
面向对象的方法是将您的基类Data用作抽象基类,例如,该方法调用get_column_names方法以获取列名列表。子类Provider1将通过返回适当的列表['A','B','C','D']来实现此方法。当然,您将为子类中当前提供的每个属性重写一种方法。例如:
from abc import ABCMeta, abstractmethod
class Data(metaclass=ABCMeta):
def some_method(self):
self.column_names = self.get_column_names()
@abstractmethod
def get_column_names(self):
pass
class Provider1(Data):
def get_column_names(self):
return ['A', 'B', 'C', 'D']