绑定方法错误

时间:2012-10-29 22:27:30

标签: python class

我正在创建一个单词解析类并继续得到一个 “绑定方法Word_Parser.sort_word_list of< main .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

7 个答案:

答案 0 :(得分:53)

这里没有错误。你正在打印一个函数,这就是函数的样子。

要实际调用该功能,您必须在此之后放置parens。你已经在上面做了。如果要打印调用函数的结果,只需让函数返回值,然后将打印放在那里。例如:

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,要么使用memoization装饰器。)

答案 1 :(得分:8)

调用不带括号的方法会导致此问题。看一下下面的例子:

nslookup foo.company.local

答案 2 :(得分: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

答案 3 :(得分: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()函数,或者更改函数指定的属性,因为当前您在第一次调用时用整数覆盖函数。

答案 4 :(得分:1)

为此,您可以使用@property作为修饰符,因此可以将实例方法用作属性。例如:

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

    @property
    def parser(self):
        self.word_list = self.sentences.split()

    @property
    def sort_word_list(self):
        self.sorted_word_list = self.word_list.sort()

    @property
    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

因此您可以使用属性而无需调用(即,无需使用())。

答案 5 :(得分: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

(或者,您可以使用properties。)

答案 6 :(得分: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

并返回: ['玛丽有只小羊羔'] ['a','有','羊羔','小','玛丽'] 5

谢谢大家。