我有一段书面代码,
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)
这是一个简单的单词计数器。但是,我想把确定文件名和单词的部分放到一个类中,以便代码可以重用于我正在处理的更大的项目。有人能指出我正确的方向吗?
答案 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或其他有关该主题的书籍。