我正在努力了解如何有效地使用类。我编写了一个程序,希望能够计算.txt文件中短语或单词的出现次数。
我不太确定如何正确调用该功能,我们非常感谢任何帮助。
感谢。
class WordCounter:
def The_Count(self):
print "Counting words..."
txt_doc = open("file")
for line in txt_doc:
if "word" in txt_doc:
word_freq = word_freq + 1
return word_freq
print "Frequency of word: %s" % word_freq
WordCounter.The_Count
答案 0 :(得分:3)
使用类与您尝试在此处执行的操作略有不同。在保存代码中的变量和对象状态方面更多地考虑它。为了完成你的任务,更像下面的东西会起作用:
class CountObject(object):
"""Instance of CountObject for measuring file lengths"""
def __init__(self, filename):
self.filename = filename
def getcount(self, word):
count = 0
infile = open(self.filename,'r')
for line in infile.readlines():
x = line.count(word)
count = count + x
return count
mycounter = CountObject('C:\list.txt')
print 'The occcurence of awesome is %s' %(str(mycounter.getcount('in')))
答案 1 :(得分:2)
首先,只是为了同意名称,类中的函数称为该类的方法。
在您的示例中,您的方法执行计算单词出现次数的操作,因此为了使其更清晰,您只需调用方法count
即可。另请注意,在Python中,方法名称以小写开头是convention。
此外,最好使用所谓的new-style classes,这些只是继承自object
的类。
最后,在Python中,一个方法需要至少有一个参数,by convention称为self
,它应该是该类的一个实例。
因此,如果我们应用这些更改,我们会得到类似的结果:
class WordCounter(object):
def count(self):
print "Counting words..."
# Rest of your code
# ...
既然你的类有一个方法,你首先需要创建一个类的实例,然后才能在其上调用该方法。因此,要在Python中创建类Foo
的实例,只需调用Foo()
即可。获得实例后,即可调用方法。使用您的示例
# Create an instance of your class and save it in a variable
my_word_counter = WordCounter()
# Call your method on the instance you have just created
my_word_counter.count()
请注意,您不需要为自己传递参数,因为the Python interpreter will replace self
的值为word_counter
,即它调用WordCounter.count(my_word_counter)
。< / p>
其他人已经注意到,你的例子并没有很好地利用Python中的类。 OO类旨在将行为(实例方法)与它们交互的数据(实例属性)放在一起。您的示例是一个简单的示例,没有与您的类关联的真实内部数据。一个好的警告可能是你从未在你的方法中使用self
。
对于与某些特定数据无关的行为,Python为您提供了编写模块级函数的灵活性 - 相反,Java迫使您将所有内容放在类中。
正如其他人所建议的那样,为了使您的示例更加OO,您可以将文件名作为参数传递给__init__
并将其另存为self.filename
。可能更好的是让你的WordCounter
期望一个类似文件的对象,这样它就不负责打开/关闭文件本身。类似的东西:
class WordCounter(object):
def __init__(self, txt_doc):
self.word_file = txt_doc
def count(self):
print "Counting words..."
for line in self.txt_doc:
# Rest of your code
# ...
with open(filename) as f:
word_counter = WordCounter(f)
word_counter.count()
最后,如果您想了解Python中有关类的更多详细信息,那么良好的信息来源始终是official documentation。
答案 2 :(得分:0)
要在类中调用方法,首先必须创建该类的实例:
c = WordCounter()
然后在该实例上调用该方法:
c.TheCount()
然而,在这种情况下,你并不真正需要课程;这可以只是一个顶级功能。当您希望每个对象都有自己的内部状态时,类最有用。
答案 3 :(得分:0)
你这里有几个问题,你发布的代码不正确python。 class方法应该引用self作为参数:
def The_Count(self):
您需要初始化word_freq以查找无法计算单词的情况:
word_freq = 0
正如其他人所提到的,你可以用这种方式调用你的函数:
counter = WordCounter()
print(counter.The_Count())
在类中包装这些无状态函数并不是真正的惯用python,就像用Java或其他东西做的那样。我将这个函数分成一个模块,让调用类处理文件I / O等。
答案 4 :(得分:0)
对于这样一个小程序,可能没有必要使用类。您可以简单地定义函数然后调用它。
但是,如果你想实现一个类设计,你可以使用(在类定义之后):
if __name__ == "__main__":
wc = WordCounter() #create instance
wc.TheCount() #call method
如果您希望稍后进一步扩展该类的功能,则使用类设计将使用更好的设计原则,同时提高代码的可读性/灵活性。
答案 5 :(得分:0)
在这种情况下,您必须将代码更改为:
class WordCounter:
def CountWords(self):
# For functions inside classes, the first parameter must always be `self`
# I'm sure there are exceptions to that rule, but none you should worry about
# right now.
print "Counting words..."
txt_doc = open("file")
word_freq = 0
for line in txt_doc:
if "word" in line: # I'm assuming you mean to use 'line' instead of 'txt_doc'
word_freq += 1
# count all the words first before returning it
txt_doc.close() # Always close files after you open them.
# (also, consider learning about the 'with' keyword)
# Either print the frequency
print "Frequency of word: %s" % word_freq
# ...or return it.
return word_freq
...然后打电话给你,你会做....
>>> foo = WordCounter() # create an instance of the class
>>> foo.CountWords() # run the function
正如其他海报所指出的那样,不是类的最有效用途。如果你把它变成顶级函数会更好,并将它改为:
def CountWords(filename, word):
with open(filename) as txt_doc:
word_freq = 0
for line in txt_doc:
if word in line:
word_freq += 1
return word_freq
......并称之为:
>>> output = CountWords("file.txt", "cat")
>>> print "Frequency of word: %s" % output
39
如果您使用类似下面的内容,那么使用类会更有意义,其中有一堆变量和函数都与一个概念性“对象”相关:
类FileStatistics: def init (self,filename): self.filename = filename
def CountWords(self, word):
pass # Add code here...
def CountNumberOfLetters(self):
pass
def AverageLineLength(self):
pass
# ...etc.