1

我正在努力了解如何有效地使用类。我编写了一个程序,希望计算 .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

4

6 回答 6

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')))
于 2012-07-16T19:17:55.833 回答
2

首先,只是为了在名称上达成一致,类中的函数称为该类的方法

在您的示例中,您的方法执行计算单词出现次数的操作,因此为了更清楚,您可以简单地调用您的方法count。另请注意,在 Python 中,方法名称以小写开头是一种约定。

此外,使用所谓的新样式类是一种很好的做法,它们只是继承自object.

最后,在 Python 中,一个方法需要至少有一个参数,按约定调用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()

请注意,您不需要为 self 传递参数,因为Python 解释器将替换 self为您的值word_counter,即它调用WordCounter.count(my_word_counter).

关于 OO 的说明

其他人已经注意到,您的示例在 Python 中不是很好地使用类。OO 类旨在将行为(实例方法)与它们交互的数据(实例属性)放在一起。您的示例是一个简单的示例,没有与您的类相关联的真实内部数据。一个好的警告可能是您从不self在方法中使用。

对于与某些特定数据无关的行为,Python 为您提供了编写模块级函数的灵活性 - 相反,Java 强制您将所有内容都放在类中。

正如其他人所建议的那样,为了使您的示例更加面向对象,您可以将文件名作为参数传递给__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 类的详细信息,一个很好的信息来源总是官方文档

于 2012-07-16T19:17:59.403 回答
0

要调用类中的方法,首先必须创建该类的实例:

c = WordCounter()

然后在该实例上调用该方法:

c.TheCount()

但是,在这种情况下,您实际上并不需要课程;这可以只是一个顶级功能。当您希望每个对象都有自己的内部状态时,类是最有用的。

于 2012-07-16T19:08:50.643 回答
0

您在这里有几个问题,您发布的代码不是正确的python。类方法应该引用 self 作为参数:

def The_Count(self):

您需要为没有字数的情况初始化 word_freq:

word_freq = 0

正如其他人所提到的,您可以这样调用您的函数:

counter = WordCounter()
print(counter.The_Count())

将这些类型的无状态函数包装在类中并不是真正惯用的 Python,就像你在 Java 或其他东西中可能做的那样。我会把这个函数分成一个模块,让调用类处理文件 I/O 等。

于 2012-07-16T19:12:35.557 回答
0

对于这样一个小程序,可能不需要使用类。您可以简单地定义该函数,然后调用它。

但是,如果您想实现一个类设计,您可以使用(在类定义之后):

if __name__ == "__main__":

wc = WordCounter() #create instance
wc.TheCount() #call method

如果您以后想进一步扩展类的功能,则使用类设计将使用更好的设计原则,同时增加代码的可读性/灵活性。

于 2012-07-16T19:19:17.663 回答
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.
于 2012-07-16T19:21:52.473 回答