如何将此代码更改为oop格式,以便重新使用代码

时间:2012-08-22 16:17:19

标签: python oop

import csv

datafile = csv.reader(open('datafile.csv','rb'), delimiter=",", quotechar='|')
date, data1, data2, data3 = [], [], [], []

for row in datafile:
    date.append(row[0])
    data1.append(row[1])
    data2.append(row[2])
    data3.append(row[3])

这是我想要做的。如您所见,此代码采用1个csv文件并从中创建4个列表。现在,我可以并将在这些列表上进行数学运算,例如data1[4]-data2[30]

但我还有一些其他文件,我也想从中创建列表。但我希望能够重用我的代码,就像我上面看到的数学(data1[4]-data2[30])一样。所以理想情况下,包括数组在内的所有内容都应该为其他文件命名相同。

我是编程的新手,所以事实证明这有点困难。显然,事情会与所有被命名相同的东西发生冲突,我不希望如此。因此,通过oop,我希望能够重新使用我的数学逻辑,而不必复制一些大量的数学算法并重命名所有内容。

显然我不想只对这4个数组进行数学运算,保存结果并更改文件名。不,一切都必须在我的程序中同时工作。

我希望我能得到一些关于如何做到这一点的提示。我正试图扩大我对oop如何工作的知识范围,但证明是困难的。我在想如何解决如何解决自己的问题是最好的。

所以回顾一下,我有4个从1个文件创建的列表。我想从另一个文件创建另外4个列表,但是这些列表的名称相同。然后我只需要创建一次大量的数学计算,让它适用于所有事情。并且它可以用于我的程序中引入的任何未来的新数据。

2 个答案:

答案 0 :(得分:1)

您需要一个数据容器,您可以通过使用适当的构造函数(此处为 init 方法)创建一个类。下面是从两个文件加载数据的示例。

import csv

datafile1 = csv.reader(open('datafile1.csv','rb'), delimiter=",", quotechar='|')
datafile2 = csv.reader(open('datafile2.csv','rb'), delimiter=",", quotechar='|')


class data(object):

    def __init__(self,data_file):

        self.date, self.data1, self.data2, self.data3 = [], [], [], []

        for row in data_file:
            self.date.append(row[0])
            self.data1.append(row[1])
            self.data2.append(row[2])
            self.data3.append(row[3])


data1 = data(datafile1)
data2 = data(datafile2)

如果你想应用方法(你描述的数学东西),你可能想把这些方法放在课堂上,你能给出一些更具体的例子来说明你想要做什么吗?

答案 1 :(得分:1)

首先,你是否一定要做OOP而不是程序?你可以将大部分内容放在一个函数中并返回一个包含列表的元组(是的,这有点像python的方式允许你从函数中返回多个值。)

OOP版本就像@ mike-vella的答案。

程序上,你可以写:

import csv

def get_datagroup(data):
    # data is the filename = 'datafile.csv'
    datafile = csv.reader(open(data,'rb'), delimiter=",", quotechar='|')
    date, data1, data2, data3 = [], [], [], []

    for row in datafile:
        date.append(row[0])
        data1.append(row[1])
        data2.append(row[2])
        data3.append(row[3])

    return (date, data1, data2, data3)

datagroup1 = get_datagroup('datafile1.csv')
datagroup2 = get_datagroup('datafile2.csv')

问题:您是否要将每个连续文件的数据附加到相应的列表中?我猜是的,因为你使用了append

import csv

def get_datagroup(data, data_tuples):
    # data is the filename = 'datafile.csv'
    # data_tuples holds date, data1,2,3
    datafile = csv.reader(open(data,'rb'), delimiter=",", quotechar='|')

    # you can use: data_tuples[0], data_tuples[1], data_tuples[2], data_tuples[3]
    # instead of : date,           data1,          data2,          data3
    date, data1, data2, data3 = data_tuples

    for row in datafile:
        date.append(row[0])
        data1.append(row[1])
        data2.append(row[2])
        data3.append(row[3])

    return (date, data1, data2, data3)

#initially, data tuples are empty
datagroup1 = get_datagroup('datafile1.csv', ([], [], [], []))
#then pass each subsequent call the last call's result tuple
#so that datagroup2 will have the results of datagroup1 and the new stuff
datagroup2 = get_datagroup('datafile2.csv', datagroup1)

您可以通过执行以下操作来进行递归:

datagroup = ([], [], [], [])
datagroup = get_datagroup('datafile1.csv', datagroup)
datagroup = get_datagroup('datafile2.csv', datagroup)
datagroup = get_datagroup('datafile3.csv', datagroup)