2014-10-13 4 views
1

У меня есть кусок написанного кода,Преобразование функций Python в классах для повторного

class Corpus: 
    def __init__(self): 
     return self 

    def __iter__(self): 
     return self 

    def __next__(self): 
     return self 

    def getwords(): 
     pass 
if __name__ == "__main__": 

    texts = [] 
    if len(sys.argv) >= 2: 
     for filename in sys.argv[1:]: 
      texts.append(str(filename)) 
    else: 
     print("Error!", sys.stderr()) 

    removables = [".", ",", "!", "?", "(", ")"] 

    text = "" 
    for filename in texts: 
     with open(filename) as f: 
      for line in f: 
       text += line 
    words = text.lower().split() 

    allwords = {} 
    for word in words: 
     for removable in removables: 
      if removable in word: 
       word = word.replace(removable, "") 
     if word in allwords: 
      allwords[word] += 1 
     else: 
      allwords[word] = 1 
    print(allwords) 

    wordsearch = input("Enter word to search : ") 
    filesearch = input("Enter file to search in: ") 
    with open(filesearch) as f2: 
     for line in f2: 
      if wordsearch in line: 
       print(line) 

    wordsunique = len(allwords) 
    wordtotal = len(words) 
    filetotal = len(texts) 


    print("Total number of words: ", wordtotal) 
    print("Total number of unique words: ", wordsunique) 
    print("Total number of files: ", filetotal) 

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

ответ

2

Короткий ответ - это один метод для каждой задачи, например.

class WordCounter(object): 

    def __call__(*filenames): 

     self.validate_arguments(filenames) 

     all_words = self.get_words_from_files(filenames) 

     counted_words = self.count_all_words() 

     word_to_search_for = self.get_word_from_user() 

Это, наряду с предоставлением всех разумных названий, облегчает жизнь для повторного использования. Разумные имена позволяют легко понять, что делает этот метод, один метод на одну задачу облегчает повторное использование. Если метод выполняет большую работу, он становится очень специализированным и вряд ли сможет многократно использоваться.

Я рекомендую проверить книгу, например, Code Complete, если вы хотите узнать больше о предмете или узнать некоторые цифры google answers.

+1

Я бы не смешивал обработку ввода (self.get_word_from_user()) с логикой обработки в одном классе. Это уменьшает возможность повторного использования. См. Шаблон проектирования MVC. Я также не уверен, если начинать с (довольно сложного) класса поможет MAK понять, что основные принципы повторного использования. – Juergen

+0

Конечно, FearofPython был вопросником, а не MAK - больше не могу исправить это в моем комментарии. – Juergen

1

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

Может быть, вы хорошо с простой функцией:

def wordCounter(fileName, word): 
    ... 

Конечно, это зависит от того, как вы хотите, чтобы использовать функциональные возможности. Вам нужно разделить функциональность по частям, как это показано на параллельном посту, чем идти с его решением. Но когда вы просто хотите повторно использовать счетчик слов в целом, одной функции может быть достаточно. Вы также можете разделить функциональность, когда используете чистые функции без классов. Разделить функциональность в разных функциях имеет смысл, чтобы иметь более структурированный и понятный код.

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

Классы не нужны для повторного использования - повторное использование было сделано задолго до того, как существовали классы. Ваша проблема в том, что вы сделали все свое кодирование на уровне модуля, что предотвращает повторное использование. Функции были изобретены для содействия повторному использованию. Классы также используются для повторного использования, но на более высоком уровне. Когда вы освоили функции и, возможно, научились теории на занятиях, я бы предложил вам прочитать что-то вроде этой книги: Design Patterns или другие книги по этой теме.

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

  • Нет связанных вопросов^_^