在Python的子类和父类之间共享属性

时间:2019-02-20 22:32:20

标签: python python-3.x

我正在构建一个脚本,用于处理来自不同提供程序的多个数据文件。由于每个文件的处理大致相同,因此我决定创建一个包含处理方法的父类“数据”。我认为这将使我的代码更加井井有条,并且,如果添加了新的数据源,则将其添加到脚本中很简单。

虽然每个文件都经过相同的处理,但是它们具有不同的详细信息-目录,文件格式,编码,列名等。每个文件具有相同的属性,但是它们的内容显然不同。这些属性没有变化,但是由于可能会有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方法是否是最佳选择。

我敢肯定,有一个解决问题的更优雅的方法,但是它并没有让我失望。一种可能的解决方案不必包括继承,但是我的主要目标是能够对将要处理的文件的详细信息进行硬编码。

谢谢!

1 个答案:

答案 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']