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 放在那里。例如:

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 指出的那样,即使你解决了这个问题,你也会 print None,因为这就是sort返回的内容。)
  • num_words设置一个名为 的变量num_words,然后您再次打印该函数——但在这种情况下,该变量与该函数具有相同的名称,这意味着您实际上是在用它的输出替换该函数,所以它可以工作。然而,这可能不是您想要做的。

(在某些情况下,乍一看,这似乎是一个好主意——你只想计算一次,然后一遍又一遍地访问它,而不是不断地重新计算。但这不是这样做的方法它。要么使用@property,要么使用 memoization 装饰器。)

于 2012-10-29T22:30:30.860 回答
15

此问题是由于调用不带括号的方法而发生的。看看下面的例子:

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()
于 2015-09-30T18:30:43.773 回答
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 回答
2

对于这个东西,您可以将@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

因此您可以在不调用的情况下使用访问属性(即,没有())。

于 2020-07-21T18:07:08.820 回答
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

语法问题是遮蔽方法和变量名。在当前版本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。)

于 2012-10-29T22:38:35.150 回答
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 回答