绑定方法错误

Mic*_*lin 28 python class

我正在创建一个单词解析类,并在运行时继续获取" 主要 .Word_Parser实例的绑定方法Word_Parser.sort_word_list 在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
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 57

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

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

print test.sort_word_list()
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想让函数改变对象的状态,然后以其他方式打印状态,那也没关系.

现在,您的代码似乎在某些地方有效,但在其他地方则无效; 让我们来看看为什么:

  • 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,然后再次打印函数 - 但在这种情况下,变量与函数名称相同,这意味着您实际上是将函数替换为其输出,因此它可以正常工作.但是,这可能不是你想要做的.

(有些情况下,乍一看,这似乎是一个好主意 - 你只想计算一次,然后一遍又一遍地访问它而不经常重新计算.但这不是办法它.使用a @property,或者使用memoization装饰器.)


bla*_*oku 8

调用没有括号的方法会导致此问题.看看下面的例子:

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()
Run Code Online (Sandbox Code Playgroud)