Class - Show all data after Three inputs

Viewed 25

In a directory, I want to show data at once by Python. But the code below is inputted once, and then shown it once. How to amend a code showing all data at once after three inputs?

class Directory:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
    def show(self):
        print("{0}, {1}year(s), {2}".format(self.name, self.age, self.gender))

for i in range(1, 4):
    a, b, c = input("Name, Age, Gender.(Please answer with a space): ").split()
    person = Directory(a, b, c)
    person.show()
1 Answers

You should really have 2 classes. One class to represent a person and another for the directory (which could be a collection of persons).

class Person:
    def __init__(self, name, age, gender):
        self._name = name
        self._age = age
        self._gender = gender
    def __str__(self):
        return f'{self._name}, {self._age}, {self._gender}'

class Directory:
    def __init__(self):
        self._persons = []
    def __iadd__(self, person):
        self._persons.append(person)
        return self
    def __str__(self):
        return '\n'.join(map(str, self._persons))

directory = Directory()

def get_person():
    if not (name := input('Name (return to finish): ')):
        return None
    while True:
        try:
            age = int(input('Age: '))
            break
        except ValueError as e:
            print(e)
    while (gender := input('Gender: ').lower()) not in {'male', 'female'}:
        print('Gender must be either male or female')
    return Person(name, age, gender)

# enter person details until name is empty
while (person := get_person()):
    directory += person

print(directory)

Output:

David, 25, male
Sue, 21, female
Related