在网上查找了关于类的教程,但编写类还是遇到了困难,这个问题一直困扰着我。我有一个想法,猜想自己编写的函数可能可以作为类的一个良好候选。这个函数接收一个字典列表,标识键并写出一个 csv 文件。我的第一个问题是,这个函数是否适合用作类(我经常写出许多 csv文件)?我的第二个问题是如果是第一个问题的答案是肯定的,我该怎么做呢? 我的第三个问题是如何使用类的实例(我是否说对了)?
2、解决方案
回答1:
对象的主要思想是对象是数据加方法。每当考虑将某物设为对象时,都必须问自己,什么是对象的数据,以及希望对该数据执行什么操作(方法)。函数比类更容易转换成方法。因此,例如,如果 dictList 是经常调用 writeCSV 的数据,那么可以创建一个具有方法 writeCSV 的 dictList 对象:
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:
要解决这个问题,你需要先理解类的概念,然后按照以下步骤操作。我也是遇到过同样的问题后并按照这个链接解决的,我相信你也可以从下面链接文章的结构化编程中开始处理类。
**链接:**www.runoob.com/python/python-oop.html
回答3:
如果你想为同一个 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)
回答4:
考虑创建对象时,请记住以下几点:
- 类具有属性——它们以不同方式描述类个不同实例的情况。
- 类具有方法——这些方法是对象执行的操作(通常涉及使用它们的属性)。
对象和类非常有用,但首先要记住,它们并不总是必要的,甚至并不总是理想的。也就是说,对于你的第一个问题,这似乎不是类的特别好的候选项。不同的 CSV 文件之间的唯一区别是数据和写入的文件,而你所能做的唯一事情(即,你将拥有的唯一方法)是你已经编写的函数。
即使第一个答案是否定的,看看类是如何构建的仍然具有指导意义。
class CSVWriter:
# 这个函数在你创建类的实例时调用
# 它设置实例的初始属性
def __init__(self, dictList, outFile):
self.dictList = dictList
self.outFile = outFile
def writeCSV(self):
# 基本上与上面完全相同,除了你可以使用实例自己的
# 变量(即 self.dictList 和 self.outFile)而不是局部
# 变量
要使用类的实例(如果是单个对象,没问题)的第一步是创建该实例:
myCSV = CSVWriter(dictList, outFile)
创建对象后,将使用参数对其调用 init——这允许你的对象拥有自己的数据。现在,你可以使用 '.' 操作符访问 myCSV 对象的任何属性或方法:
myCSV.writeCSV()
print "Wrote a file to", myCSV.outFile
考虑对象与函数的一种方法是,对象通常是名词(例如,我创建了一个 CSVWriter),而函数是动词(例如,你编写了一个写入 CSV 文件的函数)。如果你只是重复地做某事,而不重新使用任何相同的数据,那么单独使用函数就可以了。但是,如果你有许多相关数据,并且部分数据在操作过程中会发生变化,那么类可能是一个好主意。