2010-01-07 137 views
0

我仍然在努力理解类,我不确定,但我有一个想法,我创建的这个函数可能是一个类的好候选。该函数获取字典列表,标识关键字并写出一个csv文件。如何从函数创建一个类

首先Q,是这个功能的良好候选类(我写了很多的CSV文件

第二Q如果答案1是肯定的,我该怎么办呢

三Q我该如何使用类的实例(我这么说的右)

import csv 
def writeCSV(dictList,outfile): 
    maxLine=dictList[0] 
    for item in dictList: 
     if len(item)>len(maxLine): 
      maxLine=item 
    dictList.insert(0,dict((key,key) for key in maxLine.keys())) 

    csv_file=open(outfile,'ab') 
    writer = csv.DictWriter(csv_file,fieldnames=[key for key in maxLine.keys()],restval='notScanned',dialect='excel') 
    for dataLine in dictList: 
     writer.writerow(dataLine) 
    csv_file.close() 
    return 
+0

我不确定这会是一个很好的候选人,但它可能取决于你如何使用它。 当您想创建新的数据类型时使用类。这个例子中的数据类型是什么? – 2010-01-07 05:05:08

+0

有趣的是,三个答案选择了名称CSVWriter,但那么可以有任何其他名称? – 2010-01-07 05:18:25

回答

1

如果你想写很多CSV文件与dictList相同dictList(你说的是什么?),把函数转换成一个类会让你只执行一次初始化,然后重复写来自相同的初始化实例。例如,与其他未成年人OPTS:

class CsvWriter(object): 

    def __init__(self, dictList): 
    self.maxline = max(dictList, key=len) 
    self.dictList = [dict((k,k) for k in self.maxline)] 
    self.dictList.extend(dictList) 

    def doWrite(self, outfile): 
    csv_file=open(outfile,'ab') 
    writer = csv.DictWriter(csv_file, 
          fieldnames=self.maxLine.keys(), 
          restval='notScanned', 
          dialect='excel') 
    for dataLine in self.dictList: 
     writer.writerow(dataLine) 
    csv_file.close() 

这似乎是一个可疑的使用情况,但如果它不符合你的愿望,那么你最好实例化和按如下方式使用这个类...:

cw = CsvWriter(dataList) 
for ou in many_outfiles: 
    cw.doWrite(ou) 
2

对象背后的主要思想是,对象是数据加上方法。 每当你想使一些物体,你必须问自己什么是对象的da ta,以及您希望对这些数据执行哪些操作(方法)。

函数,比类更容易转换为方法。

所以,举例来说,如果你的dictList是数据时,你经常打电话writeCSV, 那么也许做一个dictList对象与方法writeCSV

class DictList(object): 
    def __init__(self,data): 
     self.data=data 
    def writeCSV(self,outfile): 
     maxLine=self.data[0] 
     for item in self.data: 
      if len(item)>len(maxLine): 
       maxLine=item 
     self.data.insert(0,dict((key,key) for key in maxLine.keys())) 
     csv_file=open(outfile,'ab') 
     writer = csv.DictWriter(
      csv_file,fieldnames=[key for key in maxLine.keys()], 
      restval='notScanned',dialect='excel') 
     for dataLine in self.data: 
      writer.writerow(dataLine) 
     csv_file.close() 

然后,你可以实例化一个DictList对象:

dl=DictList([{},{},...]) 
dl.writeCSV(outfile) 

如果您有更多方法可以在相同的DictList.data上运行,那么这样做可能会有意义。否则,你可能会更好地坚持原有的功能。

0

我不认为你的writeCSV需要一个类,当你必须更新某些状态(数据)然后采取行动时,可能会使用典型的类,可能会有各种选项。
例如如果需要传递对象,以便其他函数/方法可以为其添加值,或者您的最终操作/输出函数有很多选项,或者您认为可以通过多种方式处理相同的数据。

通常情况下,如果您有多个作用于相同数据的函数或可选参数列表将变长的单个函数,您可能会想到将其转换为类。

如果你的情况你有不同的选择,并需要以增量插入数据,你应该使它成为一个类。

一般类的名称将是名词,所以功能(动词)writeCSV - >类(名词)CSVWriter

class CSVWriter(object): 
    def __init__(self, init-params...): 
     self.data = {} 

    def addData(self, data): 
     self.data.update(data) 

    def dumpCSV(self, filePath): 
     ... 

    def dumpJSON(self, filePath): 
     .... 
1

在考虑使物体,记住这一点:

  1. 类有属性 - 描述类的不同实例的东西

  2. 类具有方法 - 对象所做的事(通常涉及使用它们的attrib utes)

对象和类是美好的,但首先要记住的是它们并不总是必要的,甚至是不可取的。

这就是说,在回答你的第一个问题时,这看起来不像是一个特别适合上课的人。你写的不同CVS文件之间唯一不同的是你写入的数据和文件,你唯一要做的事情就是你已经写的函数。 。

尽管第一个答案是否定的,但看看类是如何构建的仍然很有启发性。

class CSVWriter: 
    # this function is called when you create an instance of the class 
    # it sets up the initial attributes of the instance 
    def __init__(self, dictList, outFile): 
     self.dictList = dictList 
     self.outFile = outFile 

    def writeCSV(self): 
     # basically exactly what you have above, except you can use the instance's 
     # own variables (ie, self.dictList and self.outFile) instead of the local 
     # variables 

为了您的最后一个问题 - 第一步,使用类的一个实例(单个对象,如果你愿意)是创建一个实例:

myCSV = CSVWriter(dictList, outFile) 

在创建对象, init与您给它的参数一起调用 - 它允许您的对象拥有自己的数据。现在,您可以访问myCSV对象与'。'关联的任何属性或方法。操作:考虑对象与功能

myCSV.writeCSV() 
print "Wrote a file to", myCSV.outFile 

的一种方式是,对象一般是名词(例如,我创建了一个CSVWriter),而功能是动词(例如,你写了一个写入CSV文件的功能)。如果你只是反复做一些事情,而不重新使用任何相同的数据,一个函数本身就没有问题。但是,如果你有很多相关的数据,并且其中的一部分在行动过程中发生了变化,那么课程可能是一个好主意。

0

我认为问题1非常重要,因为它涉及到什么是课程的核心。

是的,你可以把这个功能放在一个类中。一个类是一组函数(称为方法)和数据一起在一个逻辑单元中。正如其他海报所指出的,可能用一种方法矫枉过正。

2

为此,您需要先了解一点concepts of classes,然后按照下一步操作。 我也遇到了同样的问题,并遵循这LINK,我相信你也会开始从你的结构化编程中学习类。