如何从函数创建类
我还是在努力理解类的概念。我不太确定,但我觉得我写的这个函数可能适合做成一个类。这个函数的作用是接收一个字典列表,找出里面的键,然后把这些信息写成一个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
进行操作时。否则,你可能还是直接使用原来的函数更好。
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)