2010-01-07 2 views
0

Я все еще борюсь с понимающими классами, я не уверен, но у меня есть идея, что эта функция, которую я создал, вероятно, является хорошим кандидатом для класса. Функция принимает список словарей, идентифицирует ключи и выписывает файл csv.Как создать класс из функции

Первый Q, эта функция является хорошим кандидатом для класса (выписываю много файлов CSV

Второй Q Если ответ на 1 да, как я это делаю

Третий Q как использовать экземпляры класса (я говорил, что право)

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

Я не уверен, что это будет отличный кандидат для класса, но это может зависеть от того, как вы его используете. Классы используются, когда вы хотите создать новый тип данных. Каков тип данных в этом примере? –

+0

интересно, три ответа выбрали имя CSVWriter, но тогда может быть какое-то другое имя? –

ответ

1

Если вы хотите написать много файлов CSV с тем же dictList (это то, что вы говорите ...?), Превращение функции в класс позволит вам выполнять инициализацию только один раз, а затем писать повторно из того же инициализированного экземпляра. Например, с другим незначительным ОПТСОМ:

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) 
2

Основная идея объектов является то, что объект данных плюс методы. Всякий раз, когда вы думаете о том, чтобы что-то объект, вы должны спросите себя, каким будет объект ta, и какие операции (методы) вы хотите выполнить над этими данными.

Функции, более легко переводить на методы, чем классы.

Так, например, если ваш 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. В противном случае вам, вероятно, будет лучше придерживаться исходной функции.

0

Я не думаю, что ваш writeCSV нуждается в классе, типичный класс будет использоваться, когда вам нужно обновить некоторое состояние (данные), а затем действовать на нем, может быть с различными параметрами.
, например. если вам нужно обойти свой объект, чтобы другая функция/метод могла добавлять к нему значения или ваша конечная функция действия/вывода имеет много вариантов или вы думаете, что одни и те же данные могут обрабатываться, во многих отношениях.

Обычно, если у вас есть несколько функций, которые действуют на одни и те же данные или одну функцию, список дополнительных параметров которой длинный, вы можете подумать о преобразовании его в класс.

Если в вашем случае у вас были различные варианты и вам нужно вставлять данные с шагом, вы должны сделать его классом.

Обычно имя класса будет существительное, поэтому функция (глагол) writeCSV -> класс (существительное) 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): 
     .... 
1

Когда вы думаете о том, чтобы объекты, помните:

  1. Классы имеют атрибуты - вещи, которые описывают разные экземпляры класса по-разному.

  2. Классы имеют методы - вещи, которые делают объекты (часто с использованием их атрибута utes)

Объекты и классы замечательные, но в первую очередь следует иметь в виду, что они не всегда необходимы или даже желательны.

Тем не менее, в ответ на ваш первый вопрос это не кажется особенно хорошим кандидатом для класса. Единственное, что отличается между различными файлами 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 файлов). Если вы просто делаете что-то снова и снова, без повторного использования каких-либо одних и тех же данных, сама по себе функция прекрасна. Но, если у вас много связанных данных, и часть его изменяется в ходе действия, классы могут быть хорошей идеей.

0

Я думаю, что вопрос 1 очень важен, поскольку он идет в сердце того, что класс.

Да, вы можете поместить эту функцию в класс. Класс - это набор функций (называемых методами) и данных вместе в одном логическом блоке. Как отмечали другие плакаты, возможно, слишком много, чтобы иметь класс с одним методом.

2

Для этого вам нужно сначала понять немного concepts of classes, а затем выполнить следующий шаг. Я тоже столкнулся с такой же проблемой и последовал за этим LINK, я уверен, что u также начнет работать над классами из вашего структурированного программирования.

Смежные вопросы