如何将函数创建为类

在网上查找了关于类的教程,但编写类还是遇到了困难,这个问题一直困扰着我。我有一个想法,猜想自己编写的函数可能可以作为类的一个良好候选。这个函数接收一个字典列表,标识键并写出一个 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 文件的函数)。如果你只是重复地做某事,而不重新使用任何相同的数据,那么单独使用函数就可以了。但是,如果你有许多相关数据,并且部分数据在操作过程中会发生变化,那么类可能是一个好主意。