36

単語解析クラスを作成していますが、

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
4

7 に答える 7

81

ここにエラーはありません。あなたは関数を印刷しています、そしてそれは関数がどのように見えるかです。

実際に関数を呼び出すには、その後に括弧を入れる必要があります。あなたはすでに上記でそれをやっています。関数を呼び出した結果を出力する場合は、関数に値を返してもらい、そこに出力します。例えば:

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か、メモ化デコレータを使用してください。)

于 2012-10-29T22:30:30.860 に答える
4

と呼ばれるインスタンスメソッドがありますnum_wordsが、と呼ばれる変数もありますnum_words。彼らは同じ名前を持っています。を実行するnum_words()と、関数はそれ自体を独自の出力に置き換えますが、これはおそらくあなたがやりたいことではありません。returnあなたの価値観を検討してください。

問題を解決するには、のdef num_wordsようなものに変更するdef get_num_wordsと、コードは正常に機能するはずです。また、に変更print test.sort_word_listprint test.sorted_word_listます。

于 2012-10-29T22:30:19.857 に答える
1

私はあなたがprint test.sorted_word_listの代わりに意味したと思いますprint test.sort_word_list

さらにlist.sort()、リストをその場でソートして返すNoneので、おそらくsort_word_list()次のように変更する必要があります。

self.sorted_word_list = sorted(self.word_list)

また、関数の名前を変更するか、関数が割り当てる属性を変更することも検討する必要があります。num_words()これは、現在、最初の呼び出しで関数を整数で上書きするためです。

于 2012-10-29T22:31:03.280 に答える
0

あなたの有益なコメントは、私を次の解決策に導きました:

class Word_Parser:
    """docstring for Word_Parser"""
    def __init__(self, sentences):
        self.sentences = sentences

    def parser(self):
        self.word_list = self.sentences.split()
        word_list = []
        word_list = self.word_list
        return word_list

    def sort_word_list(self):
        self.sorted_word_list = sorted(self.sentences.split())
        sorted_word_list = self.sorted_word_list
        return sorted_word_list

    def get_num_words(self):
        self.num_words = len(self.word_list)
        num_words = self.num_words
        return num_words

test = Word_Parser("mary had a little lamb")
test.parser()
test.sort_word_list()
test.get_num_words()
print test.word_list
print test.sorted_word_list
print test.num_words

['mary', 'had', 'a', 'little', 'lamb'] ['a', 'had', 'lamb', 'little', 'mary'] 5

皆さん、ありがとうございました。

于 2012-10-29T23:38:34.063 に答える
0

構文の問題は、メソッドと変数名をシャドーイングすることです。現在のバージョンsort_word_list()では、 はメソッドであり、sorted_word_listは変数ですが、num_wordsは両方です。また、list.sort()リストを変更し、ソートされたバージョンに置き換えます。関数はsorted(list)実際に新しいリストを返します。

しかし、これは設計上の問題を示していると思います。通話のポイントは何ですか

test.parser()
test.sort_word_list()
test.num_words()

何もしないのは?おそらく、適切なカウントおよび/またはソートが行われたかどうかをメソッドに把握させ、適切な場合はカウントまたはソートを実行し、それ以外の場合は何かを返す必要があります。

例えば、

def sort_word_list(self):
   if self.sorted_word_list is not None:
      self.sorted_word_list = sorted(self.word_list)
   return self.sorted_word_list

(代わりに、プロパティを使用することもできます。)

于 2012-10-29T22:38:35.150 に答える