如何从函数创建类

0 投票
6 回答
1024 浏览
提问于 2025-04-15 17:43

我还是在努力理解类的概念。我不太确定,但我觉得我写的这个函数可能适合做成一个类。这个函数的作用是接收一个字典列表,找出里面的键,然后把这些信息写成一个csv文件。

第一个问题,这个函数适合做成一个类吗?(因为我经常需要写很多csv文件)

第二个问题,如果第一个问题的答案是“是”,那我该怎么做呢?

第三个问题,我该怎么使用这个类的实例(我这样说对吗)

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 个回答

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 进行操作时。否则,你可能还是直接使用原来的函数更好。

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)

撰写回答