【问题标题】:How to create a class from function如何从函数创建一个类
【发布时间】:2010-01-07 04:54:30
【问题描述】:

我仍然在努力理解类,我不确定,但我知道我创建的这个函数可能是一个很好的类候选。该函数获取一个字典列表,识别键并写出一个 csv 文件。

第一个问题,这个函数是不是一个类的好候选(我写了很多csv文件

第二个问题如果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

【问题讨论】:

  • 我不确定这是否是一个很好的课程候选人,但这可能取决于你如何使用它。当您想要创建新的数据类型时使用类。本例中的数据类型是什么?
  • 有意思,三个答案都选择了名字CSVWriter,但那还能有别的名字吗?

标签: python class


【解决方案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】:

    为此,您需要先了解一点concepts of classes,然后再进行下一步。 我也遇到了同样的问题并遵循了这个LINK,我相信你也将从你的结构化编程开始学习课程。

    【讨论】:

      【解决方案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】:

        在考虑制作对象时,请记住:

        1. 类具有属性 - 以不同方式描述类的不同实例的事物

        2. 类具有方法 - 对象所做的事情(通常涉及使用它们的属性)

        对象和类很棒,但首先要记住的是,它们并不总是必要的,甚至是不可取的。

        也就是说,在回答您的第一个问题时,这似乎不是一个特别好的课程候选人。您正在编写的不同 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 文件的函数)。如果您只是一遍又一遍地做某事,而不重复使用任何相同的数据,那么函数本身就可以了。但是,如果您有大量相关数据,并且其中一部分在操作过程中发生了变化,那么类可能是个好主意。

        【讨论】:

          【解决方案5】:

          我认为您的 writeCSV 不需要类,当您必须更新某些状态(数据)然后对其采取行动时,通常会使用类,可能有各种选项。
          例如如果您需要传递您的对象,以便其他函数/方法可以为其添加值,或者您的最终操作/输出函数有很多选项,或者您认为可以处理相同的数据,以多种方式进行操作。

          典型的实际情况是,如果您有多个作用于相同数据的函数或一个可选参数列表很长的单个函数,您可能会考虑将其转换为一个类。

          如果在您的情况下您有多种选择并且需要以增量方式插入数据,您应该将其设为一个类。

          通常类名是名词,所以 function(verb) writeCSV -> class(noun) 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):
                  ....
          

          【讨论】:

            【解决方案6】:

            我认为问题 1 非常关键,因为它触及了课程的核心。

            是的,你可以把这个函数放在一个类中。一个类是一组函数(称为方法)和数据,它们在一个逻辑单元中。正如其他发帖人所指出的那样,使用一种方法创建一个类可能有点过头了。

            【讨论】:

              猜你喜欢
              • 2020-07-03
              • 1970-01-01
              • 1970-01-01
              • 2020-10-23
              • 2018-06-14
              • 1970-01-01
              • 2020-06-01
              • 2020-04-22
              • 2020-12-20
              相关资源
              最近更新 更多