Bound method error
There's no error here. You're printing a function, and that's what functions look like.
To actually call the function, you have to put parens after that. You're already doing that above. If you want to print the result of calling the function, just have the function return the value, and put the print there. For example:
print test.sort_word_list()
On the other hand, if you want the function to mutate the object's state, and then print the state some other way, that's fine too.
Now, your code seems to work in some places, but not others; let's look at why:
parser
sets a variable calledword_list
, and you laterprint test.word_list
, so that works.sort_word_list
sets a variable calledsorted_word_list
, and you laterprint test.sort_word_list
—that is, the function, not the variable. So, you see the bound method. (Also, as Jon Clements points out, even if you fix this, you're going to printNone
, because that's whatsort
returns.)num_words
sets a variable callednum_words
, and you again print the function—but in this case, the variable has the same name as the function, meaning that you're actually replacing the function with its output, so it works. This is probably not what you want to do, however.
(There are cases where, at first glance, that seems like it might be a good idea—you only want to compute something once, and then access it over and over again without constantly recomputing that. But this isn't the way to do it. Either use a @property
, or use a memoization decorator.)
This problem happens as a result of calling a method without brackets. Take a look at the example below:
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()
You have an instance method called num_words
, but you also have a variable called num_words
. They have the same name. When you run num_words()
, the function replaces itself with its own output, which probably isn't what you want to do. Consider return
ing your values.
To fix your problem, change def num_words
to something like def get_num_words
and your code should work fine. Also, change print test.sort_word_list
to print test.sorted_word_list
.