当我调用函数时“绑定方法”错误是什么意思?
- 2025-03-21 09:06:00
- admin 原创
- 41
问题描述:
我正在创建一个单词解析类,但一直收到
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
解决方案 1:
这里没有错误。你正在打印一个函数,这就是函数的样子。
要实际调用该函数,您必须在其后放置括号。您已经在上面这样做了。如果您想打印调用该函数的结果,只需让函数返回值,然后将打印放在那里。例如:
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:
对于这个东西,你可以将其用作@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
因此您无需调用即可访问属性(即无需()
)。
解决方案 4:
您有一个名为 的实例方法num_words
,但还有一个名为 的变量num_words
。它们具有相同的名称。当您运行 时num_words()
,该函数会用其自己的输出替换自身,这可能不是您想要的。考虑return
您的价值观。
要解决您的问题,请将其更改def num_words
为类似 的内容def get_num_words
,您的代码应该可以正常工作。此外,将其更改print test.sort_word_list
为print test.sorted_word_list
。
解决方案 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:
如果您执行以下操作,也会发生绑定方法错误(例如,在 Django 应用程序中):
class Products(models.Model):
product_category = models.ForeignKey(ProductCategory, on_delete=models.Protect)
def product_category(self)
return self.product_category
如果您命名一种方法,则其命名方式与命名字段的方式相同。
解决方案 7:
语法问题在于隐藏方法和变量名称。在当前版本中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
(或者,您可以使用属性。)
解决方案 8:
您的有益评论使我找到了以下解决方案:
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
谢谢大家。
扫码咨询,免费领取项目管理大礼包!