【问题标题】:Converting Python functions to classes for reusability将 Python 函数转换为类以实现可重用性
【发布时间】:2014-10-13 23:41:22
【问题描述】:

我有一段写好的代码,

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)

这是一个简单的单词计数器。但是,我宁愿将确定要搜索的文件名和单词的部分放入一个类中,以便代码可重用于我正在处理的更大项目。谁能指出我正确的方向?

【问题讨论】:

    标签: python class code-reuse reusability


    【解决方案1】:

    简短的回答是每个任务使用一种方法,例如

    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

    【讨论】:

    • 我不会在一个类中混合输入处理 (self.get_word_from_user()) 和处理逻辑。这降低了可重用性。请参阅 MVC 设计模式。我也不确定,如果从一个(相当复杂的)类开始是否有助于 MAK 理解重用的基本原则是什么。
    • 当然,FearofPython 是提问者,而不是 MAK——在我的评论中无法再纠正它。
    【解决方案2】:

    当您只想拥有一个可重复使用的单词计数器时,您不一定需要一个类。

    也许你对一个简单的函数没问题:

    def wordCounter(fileName, word):
       ...
    

    当然,这取决于您希望如何使用该功能。您是否需要将功能分成几部分,正如并行帖子中所展示的那样,而不是采用他的解决方案。但是,当您只想将单词计数器作为一个整体重用时,一个函数就足够了。当您使用没有类的纯函数时,您还可以拆分功能。将功能拆分为不同的功能是有意义的,以使其具有更好的结构和更易于理解的代码。

    但是一个简单的单词计数器不一定需要是一个类。当它具有更多功能时,例如过滤器或停用词列表,我也倾向于使用一个类。

    重用不需要类——重用早在类存在之前就已经完成。您的问题是您已经在模块级别完成了所有编码,这阻止了重用。发明功能是为了促进重用。类也用于重用,但在更高级别。当你掌握了函数并且可能学习了一些关于类的理论时,我建议你阅读类似这本书的东西:Design Patterns,或其他有关该主题的书籍。

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2021-11-01
      • 1970-01-01
      • 2021-04-09
      • 2021-05-14
      相关资源
      最近更新 更多