Ошибка связанного метода

Я создаю класс разбора слов и продолжаю получать «связанный метод Word_Parser.sort_word_list < main .Word_Parser instance при 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 

  • Сюжет Панды не накладывается
  • Форматирование комплексных номеров
  • Python 3.4 - текст для речи с SAPI
  • Сравнение строк в Python: vs. ==
  • Вызовите функцию python с помощью HTML
  • Легкий рендеринг HTML с CSS в Python
  • Как сохранить таблицу Excel как CSV из Python (Unix)?
  • pandas xlsxwriter, заголовок форматирования
  • 6 Solutions collect form web for “Ошибка связанного метода”

    Здесь нет ошибки. Вы печатаете функцию, и вот какие функции выглядят.

    Чтобы на самом деле вызвать функцию, вам нужно поставить parens после этого. Вы уже делаете это выше. Если вы хотите напечатать результат вызова функции, просто верните функцию и верните ее. Например:

     print test.sort_word_list() 

    С другой стороны, если вы хотите, чтобы функция мутировала состояние объекта, а затем печатала состояние другим способом, это тоже хорошо.

    Теперь ваш код, кажется, работает в некоторых местах, но не в других; давайте посмотрим, почему:

    • parser задает переменную, называемую word_list , и вы позже print test.word_list , так что это работает.
    • sort_word_list устанавливает переменную с именем sorted_word_list , и вы позже print test.sort_word_list то есть функцию, а не переменную. Итак, вы видите связанный метод. (Кроме того, как указывает Джон Клементс, даже если вы исправите это, вы собираетесь напечатать None , потому что это то, что возвращается.)
    • num_words задает переменную num_words , и вы снова распечатываете функцию, но в этом случае переменная имеет то же имя, что и функция, что означает, что вы фактически заменяете функцию своим выходом, поэтому она работает. Это, вероятно, не то, что вы хотите сделать.

    (Есть случаи, когда на первый взгляд кажется, что это может быть хорошей идеей – вы только хотите что-то вычислить один раз, а затем обращаться к нему снова и снова, не постоянно пересматривая это. Но это не способ сделать это либо использовать @property , либо использовать декоратор memoization.)

    У вас есть метод экземпляра, называемый num_words , но у вас также есть переменная с именем num_words . Они имеют одно и то же имя. Когда вы запускаете num_words() , функция заменяет собой свой собственный вывод, что, вероятно , не то, что вы хотите сделать. Подумайте о return своих значений.

    Чтобы исправить вашу проблему, измените def num_words на что-то вроде def get_num_words и ваш код должен работать нормально. Кроме того, измените print test.sort_word_list для print test.sorted_word_list .

    Эта проблема возникает в результате вызова метода без скобок. Взгляните на приведенный ниже пример:

     class SomeClass(object): def __init__(self): print 'I am starting' def some_meth(self): print 'I am a method()' x = SomeClass() ''' Not adding the bracket after the method call would result in method bound error ''' print x.some_meth ''' However this is how it should be called and it does solve it ''' x.some_meth() 

    Я думаю, вы имели в виду 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() или изменения атрибута, которому назначается функция, поскольку в настоящее время вы переписываете функцию с помощью целого числа при первом вызове.

    Синтаксическая проблема – метод теневого копирования и имена переменных. В текущей версии 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 

    (В качестве альтернативы вы можете использовать свойства .)

    Ваши полезные комментарии привели меня к следующему решению:

     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

    Спасибо вам всем.

    Python - лучший язык программирования в мире.