How can I access to the attributes of an object of a class?

Question:

I have the following code:

class Animal:
    def __init__(self, age, name) -> None:
        self.age = age
        self.name = name
    
    def getAge(self):
        return self.age
    
    def getName(self):
        return self.name
    
class Animals:
    def __init__(self, index) -> None:
            self.index = index
            self.animalList = None
    
    def startInsert(self):
        newTable = list()
        for i in range(self.index):
            newTable.append(None)
        self.animalList = newTable
        
    def insertInIndex(self, index, animalObject):
        for i in range(len(self.animalList)):
            if i == index:
                self.animalList[i] = animalObject
    
    def show(this):
        for i in range(len(this.animalList)):
            if this.animalList[i] is not None:
                print('index: ',i,', Age: ',this.animalList[i].getAge,', Name: ',this.animalList[i].getAge)

animals = Animals(5)
animals.startInsert()
cow = Animal(2, "Cow")
dog = Animal(3, "Dog")
animals.insertInIndex(2, cow)
animals.insertInIndex(3, dog)
animals.show()

I want to send an object Animal to my list animalList which one is part of theAnimals class

My problem is that I can not access to the Age and Name attributes of my Animal class from my Animals class

My expected output is:

index: 2, Age: 2, Type: Cow
index: 3, Age: 3, Type: Dog

What I have done is:

def show(this):
        for i in range(len(this.animalList)):
            if this.animalList[i] is not None:
                print('index: ',i,', Age: ',this.animalList[i].getAge,', Name: ',this.animalList[i].getAge)

But my console just shows the next memory addresses:

index:  2 , Age:  <bound method Animal.getAge of <__main__.Animal object at 0x00000200ead03cd0>> , Type:  <bound method Animal.getAge of <__main__.Animal object at 0x00000200ead03cd0>>
index:  3 , Age:  <bound method Animal.getAge of <__main__.Animal object at 0x00000200ead03c70>> , Type:  <bound method Animal.getAge of <__main__.Animal object at 0x00000200ead03c70>>

Thanks.

Asked By: asker

||

Answers:

The problem is in this line:

print('index: ',i,', Age: ',this.animalList[i].getAge,', Name: ',this.animalList[i].getAge)

You are printing this.animalList[i].getAge, which is a function. To actually get the age, you must call the function like this.animalList[i].getAge().

This alone will resolve the question, however, your question has a few other (minor) issues. In the code below, I have removed your getter functions (which are unnecessary and are causing you confusion), corrected indentation, and refactored some code to make it look better. I also removed the animals.startInsert method, as it should be part of the constructor. I hope this helps you understand better:

class Animal:
    def __init__(self, age, name) -> None:
        self.age = age
        self.name = name


class Animals:
    def __init__(self, index) -> None:
        self.index = index
        self.animalList = [None for i in range(index)]

    def insertInIndex(self, index, animalObject):
        self.animalList[index] = animalObject

    def show(self):
        for i in range(len(self.animalList)):
            if self.animalList[i] is not None:
                print('index: ', i, ', Age: ', self.animalList[i].age,
                      ', Name: ', self.animalList[i].age)


animals = Animals(5)
cow = Animal(2, "Cow")
dog = Animal(3, "Dog")
animals.insertInIndex(2, cow)
animals.insertInIndex(3, dog)
animals.show()
Answered By: Michael M.