Python在Classes中执行函数

时间:2012-07-16 19:02:25

标签: python file class

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

6 个答案:

答案 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>

关于OO的说明

其他人已经注意到,你的例子并没有很好地利用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.