Cyanidies Cyanidies - 1 month ago 4
Python Question

Issue calling method outside class python

I'm working on a python assingment involving creating and using a class with several methods. I won't post the whole thing as it'll be simpler to point out my issue if I instead show an example of what I'm trying to do.

class Fruit(self,color,name):
def __init__(self, color, name):
self.color = color = name

def return_list(self, index):
print fruit_list[index]

fruit_list = []

fruit_1 = Fruit("red", "apple")

So the above code works. My issue is getting return_list to work when used outside of the class, as so:

fruit_choice = int(raw_input("What fruit would you like?"))

Basically I'm trying to create a method that when called, outputs the item at an index within a list, the index being specified by user input (i.e fruit_choice = 0, printed item is first element of list.)

I have a basic understanding of classes, but getting a somewhat vague method to work like return_list is a little unintuitive. The error message I get:

TypeError: unbound method return_list() must be called with Fruit instance as first argument (got int instance instead)

I know that if I got the code to work the output would be "red" if input was 0 instead of "red,"apple", but that's an issue for another time.

If someone could point out to me what I'm doing wrong in creating/calling the return_list method, please and thanks.


You seem to have a misunderstanding of Classes and class instances.

The return_list function you have defined is part of the Fruit class, i.e. each instance of the Fruit class contains this method. But the use of this function, which is to return a specific fruit from fruit list, is independent of the individual Fruit instances, which means this method should not have been in the Fruit class in the first place.

The signature of class definition class Fruit(self,color,name) is wrong. It should be class Fruit:. The initial parameters should be defined as parameters to the __init__ method.

The list fruit_list should contain Fruit instances. The program could be written as:

class Fruit:
    def __init__(self, color, name):
        self.color = color = name

    def __str__(self):
        return 'I am a ' + self.color + ' ' +

fruit_list = []

fruit_1 = Fruit("red", "apple")

fruit_choice = int(raw_input("What fruit would you like?"))

Printing a Python object calls the __str__ magic method.

If you do really want to have a separate function which returns a Fruit from the fruit_list, you can define a function outside the class (but these seem unnecessary when you can directly access the instance using the index):

def return_list(list, index):
    return list[index]


def return_list(index):
    global fruit_list
    return fruit_list[index]

If you try to print the entire list using print(fruit_list) the output is:

[<__main__.Fruit instance at 0x110091cf8>]

That is because Python does not call __str__ on each instance when you print a list of instances. You can print the fruit_list by doing:

for fruit in fruit_list: