我仍在努力理解课程,我不确定,但我知道我创建的这个功能可能是一个很好的候选课程。该函数获取字典列表,标识键并写出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
答案 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)
在考虑制作物品时,请记住:
类具有属性 - 以不同方式描述类的不同实例的内容
类有方法 - 对象所做的事情(通常涉及使用它们的属性)
对象和类很棒,但要记住的第一件事是它们并不总是必要的,甚至是不可取的。
那就是说,在回答你的第一个问题时,这似乎不是一个特别好的候选人。您正在编写的不同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非常重要,因为它涉及到课程的核心。
是的,您可以将此功能放在课堂上。类是一组函数(称为方法)和数据在一个逻辑单元中。正如其他海报所指出的那样,用一种方法来上课可能有些过分。