我正在创建一个单词解析类并继续得到一个 “绑定方法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
答案 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
谢谢大家。