如何从函数创建一个类

时间:2010-01-07 04:54:30

标签: python class

我仍在努力理解课程,我不确定,但我知道我创建的这个功能可能是一个很好的候选课程。该函数获取字典列表,标识键并写出csv文件。

第一个Q,这个函数是一个很好的候选类(我写了很多csv文件

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

第三问我如何使用班级的实例(我说得对吗)

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

6 个答案:

答案 0 :(得分:2)

对象背后的主要思想是对象是数据加方法。 每当你想要创建一个对象时,你必须问自己对象的数据是什么,以及你想对这些数据执行什么操作(方法)。

函数,更容易转换为方法而不是类。

因此,例如,如果您的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上运行的方法,这样做可能会有意义。否则,你可能最好坚持使用原始功能。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

如果你想编写大量具有相同dictList的CSV文件(就是你所说的......?),将函数转换为类只会让你只进行一次初始化,并且然后从同一个初始化实例重复写入。例如,与其他次要选择:

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)

答案 3 :(得分:1)

在考虑制作物品时,请记住:

  1. 类具有属性 - 以不同方式描述类的不同实例的内容

  2. 类有方法 - 对象所做的事情(通常涉及使用它们的属性)

  3. 对象和类很棒,但要记住的第一件事是它们并不总是必要的,甚至是不可取的。

    那就是说,在回答你的第一个问题时,这似乎不是一个特别好的候选人。您正在编写的不同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文件的函数)。如果你只是一遍又一遍地做一些事情,而不重复使用任何相同的数据,一个函数本身就可以了。但是,如果你有很多相关的数据,并且在行动过程中部分内容会发生变化,那么上课可能是一个好主意。

答案 4 :(得分:0)

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

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

如果在您的情况下您有各种选项并需要以增量方式插入数据,则应将其设为类。

通常类名是名词,所以函数(动词)writeCSV - > class(名词)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):
        ....

答案 5 :(得分:0)

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

是的,您可以将此功能放在课堂上。类是一组函数(称为方法)和数据在一个逻辑单元中。正如其他海报所指出的那样,用一种方法来上课可能有些过分。