私は単語解析クラスを作成していますが、
bound method Word_Parser.sort_word_list of <__main__.Word_Parser instance at 0x1037dd3b0>
これを実行するとエラーが発生します:
class Word_Parser:
"""docstring for Word_Parser"""
def __init__(self, sentences):
self.sentences = sentences
def parser(self):
self.word_list = self.sentences.split()
def sort_word_list(self):
self.sorted_word_list = self.word_list.sort()
def num_words(self):
self.num_words = len(self.word_list)
test = Word_Parser("mary had a little lamb")
test.parser()
test.sort_word_list()
test.num_words()
print test.word_list
print test.sort_word_list
print test.num_words
ベストアンサー1
ここではエラーはありません。関数を印刷していますが、関数とはこのようなものなのです。
実際に電話関数を呼び出す場合は、その後に括弧を付ける必要があります。これはすでに上で行っています。関数を呼び出した結果を出力したい場合は、関数に値を返させて、そこに出力を記述します。たとえば、次のようになります。
print test.sort_word_list()
一方、関数でオブジェクトの状態を変更し、その状態を別の方法で出力したい場合も、問題ありません。
さて、コードはいくつかの場所では機能しているように見えますが、他の場所では機能していないようです。その理由を見てみましょう。
parser
という変数を設定しword_list
、後で を設定するprint test.word_list
と、それが機能します。sort_word_list
は という変数を設定しsorted_word_list
、その後print test.sort_word_list
、変数ではなく関数を設定します。つまり、バインドされたメソッドが表示されます。(また、Jon Clements が指摘しているように、これを修正したとしても、None
がsort
返されるため、 が印刷されます。)num_words
という変数を設定しnum_words
、再び関数を出力します。ただし、この場合、変数の名前は関数と同じなので、実際には関数をその出力に置き換えているので、うまくいきます。ただし、これはおそらくあなたがやりたいことではないかもしれません。
(一見すると、これは良いアイデアのように思える場合があります。つまり、何かを一度だけ計算し、それを何度も何度もアクセスして、それを常に再計算しないようにしたい場合です。しかし、これはそれを行う方法ではありません。 を使用するか@property
、メモ化デコレータを使用してください。)