【问题标题】:What does "bound method" error mean when I call a function?当我调用函数时,“绑定方法”错误是什么意思?
【发布时间】:2012-10-29 22:27:29
【问题描述】:

我正在创建一个单词解析类,我不断得到一个

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

【问题讨论】:

  • 我要补充一点,self.sorted_word_list = self.word_list.sort() 并没有按照您的想法执行 - .sort() 对列表进行就地 排序并返回None。您想使用返回新列表的sorted,例如:self.sorted_word_list = sorted(self.word_list)

标签: python class


【解决方案1】:

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

要真正调用这个函数,你必须在那之后加上括号。你已经在上面做了。如果要打印调用函数的结果,只需让函数返回值,然后将 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 指出的那样,即使你解决了这个问题,你也会打印 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() 时,该函数会用自己的输出替换自己,这可能不是您想要做的。考虑returning 你的价值观。

      要解决您的问题,请将def num_words 更改为def get_num_words 之类的内容,您的代码应该可以正常工作。另外,将print test.sort_word_list 更改为print test.sorted_word_list

      【讨论】:

        【解决方案4】:

        对于这个东西,你可以使用@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】:

          我认为您的意思是 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() 函数,或更改函数分配给的属性,因为目前您在第一次调用时使用整数覆盖该函数。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 他们什么都不做;它们会改变对象的状态。对于方法来说,这是一件非常合理的事情。
            • @abarnet 好点。但是,似乎 OP 实际上 认为 list.sort() 实际上返回了一个排序列表(并且我已经相应地修改了我的答案)。
            • 真;一个做一些工作的函数,把它扔掉,无条件地将一个成员设置为 None 有点傻……但是其他两个函数不是什么都不做的方法。
            【解决方案7】:

            您乐于助人的 cmets 使我找到了以下解决方案:

            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

            谢谢大家。

            【讨论】:

              猜你喜欢
              • 2019-05-14
              • 1970-01-01
              • 2019-02-12
              • 2020-12-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-17
              相关资源
              最近更新 更多