将Python函数转换为可重用性的类

时间:2014-10-13 23:41:23

标签: python class code-reuse reusability

我有一段书面代码,

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)

这是一个简单的单词计数器。但是,我想把确定文件名和单词的部分放到一个类中,以便代码可以重用于我正在处理的更大的项目。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

当您只想拥有一个可重复使用的文字计数器时,您不一定需要一个课程。

也许你对一个简单的功能很好:

def wordCounter(fileName, word):
   ...

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

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

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