まず、名前に同意するために、クラス内の関数はそのクラスのメソッドと呼ばれます。
あなたの例では、メソッドは単語の出現回数をカウントするアクションを実行するため、明確にするために、単にメソッドを呼び出すことができますcount
。また、Python では、メソッド名を小文字で始めるのが慣例であることにも注意してください。
また、単に を継承したクラスである、いわゆる新しいスタイルのクラスobject
を使用することをお勧めします。
最後に、Python では、メソッドには少なくとも 1 つのパラメータが必要です。これは慣例により呼び出されself
、クラスのインスタンスである必要があります。
したがって、これらの変更を適用すると、次のようになります。
class WordCounter(object):
def count(self):
print "Counting words..."
# Rest of your code
# ...
クラスにメソッドがあるので、そのメソッドを呼び出す前に、まずクラスのインスタンスを作成する必要があります。したがって、Foo
Python でクラスのインスタンスを作成するには、単に を呼び出す必要があります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 に引数を渡す必要がないことに注意してください。self
word_counter
WordCounter.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 のクラスについてさらに詳しく知りたい場合は、常に公式ドキュメントを参照してください。