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 では、メソッドには少なくとも 1 つのパラメータが必要です。これは慣例により呼び出されself、クラスのインスタンスである必要があります。

したがって、これらの変更を適用すると、次のようになります。

class WordCounter(object):

    def count(self):  
        print "Counting words..."
    
        # Rest of your code
        # ...

クラスにメソッドがあるので、そのメソッドを呼び出す前に、まずクラスのインスタンスを作成する必要があります。したがって、FooPython でクラスのインスタンスを作成するには、単に を呼び出す必要があります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()

Python インタープリターが forの値に置き換えるため 、つまり、 を呼び出すため、 self に引数を渡す必要がないことに注意してください。selfword_counterWordCounter.count(my_word_counter)

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 のクラスについてさらに詳しく知りたい場合は、常に公式ドキュメントを参照してください。

于 2012-07-16T19:17:59.403 に答える
0

クラス内のメソッドを呼び出すには、最初にそのクラスのインスタンスを作成する必要があります。

c = WordCounter()

次に、そのインスタンスでメソッドを呼び出します。

c.TheCount()

ただし、この場合、実際にはクラスは必要ありません。これは単なるトップレベルの関数である可能性があります。クラスは、各オブジェクトに独自の内部状態を持たせたい場合に最も役立ちます。

于 2012-07-16T19:08:50.643 に答える
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

以下のようなものがある場合、クラスを使用する方が少し理にかなっています。ここでは、すべてが 1 つの概念的な「オブジェクト」に関連する一連の変数と関数があります。

クラス 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 に答える
0

ここにいくつかの問題があります。投稿したコードは正しい python ではありません。クラス メソッドは、self への参照を引数として受け取る必要があります。

def The_Count(self):

カウントする単語がない場合は、word_freq を初期化する必要があります。

word_freq = 0

他の人が述べたように、次の方法で関数を呼び出すことができます。

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

Java などで行うように、これらの種類のステートレス関数をクラスでラップすることは、Python ではあまり一般的ではありません。この関数をモジュールに分割し、呼び出し元のクラスにファイル 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 に答える