Подтвердить что ты не робот

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

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

Ответ 1

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

Чтобы на самом деле вызывать функцию, вы должны поставить 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, потому что возвращается sort.)
  • num_words задает переменную с именем num_words, и вы снова распечатываете функцию, но в этом случае переменная имеет то же имя, что и функция, что означает, что вы фактически заменяете функцию ее выходом, поэтому оно работает. Это, вероятно, не то, что вы хотите сделать.

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

Ответ 2

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

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()

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

и возвращает: ['у Мэри был маленький ягненок'] ['a', 'had', 'lamb', 'little', 'mary'] 5

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