pasta1020
pasta1020

Reputation: 188

Printing a list from a class in Python

My simplified code is below: it creates an animal, and places it inside a zoo. I want to print the list of animals within the zoo. Going round in circles with this!

class Animal(object):

    def __init__(self, name):
        self.name = name

class Zoo(object):

    def __init__(self):
        self.animals = []

    def __str__(self):
        rep = ", ".join(self.animals)
        return rep

    def add(self, name):
        self.animals.append(Animal(name))

def main():

    while True:
        zoo = Zoo()
        animal = input("add an animal: ")
        zoo.add(animal)
        print(zoo)

main()

Upvotes: 2

Views: 4780

Answers (2)

AChampion
AChampion

Reputation: 30258

You can simply refer to the name property of Animal in your Zoo.__str__(), e.g.:

def __str__(self):
    return ', '.join(animal.name for animal in self.animals)

Now print(zoo) should work correctly.

However this doesn't provide a lot of encapsulation if say you wanted to change what it means to print an animal, e.g. height, size, etc. So perhaps a more encapsulated form would be:

class Animal(object):
    ...
    def __str__(self):
        return self.name

class Zoo(object):
    ...
    def __str__(self):
        return ", ".join(str(animal) for animal in self.animals)

Now when you print(zoo) the Animal class is responsible for its own string presentation.
Just as a note: you probably should create the Animal instance outside of Zoo, what happens if you decide to create a class hierarchy of Animals (e.g. Mammal) that has different behaviours, your Zoo class would only know about Animals.

class Animal(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name

class Zoo(object):
    def __init__(self):
        self.animals = []
    def __str__(self):
        return ", ".join(str(animal) for animal in self.animals)
    def add(self, animal):
        self.animals.append(animal)

def main():
    zoo = Zoo()
    while True:
        animal = Animal(input("add an animal: "))
        zoo.add(animal)
        print(zoo)

main()

This would still behave properly if you create a Mammal class:

class Mammal(Animal):
    ...

zoo.add(Mammal(...))
print(zoo)

Upvotes: 1

Richy
Richy

Reputation: 380

The added __repr__ Method to the Animal returns us the name.

The zoo = Zoo() has to be outside of the loop, this makes sure that we do not create a new zoo with every iteration.

Then we print the list (zoo.animals).

class Animal(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return self.name



class Zoo(object):
    def __init__(self):
        self.animals = []
    def __str__(self):
        rep = ", ".join(self.animals)
        return rep
    def add(self, name):
        self.animals.append(Animal(name))



def main():
    zoo = Zoo()
    while True:
        animal = input("add an animal: ")
        zoo.add(animal)
        print(zoo.animals)


main()

Upvotes: 3

Related Questions