1. ホーム
  2. python

[解決済み] 関数を呼び出すと「bound method」というエラーが出ますが、どういう意味ですか?

2022-03-04 13:34:28

質問

単語解析のクラスを作成しているのですが、何度やっても

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

解決方法は?

ここではエラーはありません。関数を出力しているのですから、関数はそういうものです。

実際に コール を使うには、その後に括弧を付けなければなりません。上ではすでにそうしていますね。関数を呼び出した結果を表示したい場合は、関数が値を返すようにし、そこにprintを入れればいいのです。例えば

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 または、メモ化デコレータを使用します)。