
Mi problema es que me han pedido que haga una clase de Python sobre Animales, en la que tiene como atributos el Nombre, la Fecha de Nacimiento, el Tipo, el Estado y el ID. La idea es que el programa tiene un menú y la primera opción es "Crear Animal", donde se pide al usuario introducir la información de los animales. La cosa es que si se escoge esta opcion 10 veces, la 10 deberá quedar guardado la información de los distintos animales. He probado definiendo funciones o métodos dentro de la clase, haciéndolo fuera, etc. Y lo único que consigo es que se guare el último animal introducido, no que se guarden todos. He probado con diccionarios, con tuplas y con listas, haciendo por ejemplo una lista de listas donde cada lista tenga el contenido de un animal. Pero como decía haga lo que haga y ponga donde lo ponga solo consigo almacenar el último introducido. Os adjuntaré el código de lo que tengo hecho, las frases de cortesía al usuario están en catalán pero imagino que se entenderá más o menos (soy principiante y sé que puede haber cosas mal). Gracias de antemano.



```
class Animal:
    def __init__ (self, nom, datanaix, tipus, estat, id):
        self.nom=nom
        self.datanaix=datanaix
        self.tipus=tipus
        self.estat=estat
        self.id=id
    def getnom(self):
        return self.nom
    def getdatanaix(self):
        return self.datanaix
    def gettipus(self):
        return self.tipus
    def getestat(self):
        return self.estat
    def getid(self):
        return self.id

```

Y aquí el menú:



```
sortir=False
while not sortir:
    print("Escull una opció")
    print("1. Crear Animal")
    print("2. Crear Propietari")
    print("3. Mostrar Animals")
    print("4. Mostrar Animals per tipus")
    print("5. Mostrar Propietaris")
    print("6. Fer Log-in")
    print("7. Sortir")

    opcio=int(input("Introdueix la opció: "))
    if opcio==1:
        nom=input("Introdueix el nom: ")
        nom=nom.lower()
        datanaix=input("Introdueix la data de naixement: ")
        tipus=input("Introdueix el tipus Gos (G), Conill (C) o Serp (S): ")
        tipus=tipus.upper()
        estat=input("Introdueix l'estat, es a dir, si té propietari: ")
        id=tipus+"-"+nom
        obj1=Animal(nom, datanaix, tipus, estat, id)
        obj1.mostraranimal()
        #obj1.omplediccionari() #no se si esta funcion se tendrá que usar o no
        list=[]
        list.append(Animal(nom, datanaix, tipus, estat, id))

```


[¿Cómo hago objetos “ilimitados” de una clase?](/questions/357851/c%c3%b3mo-hago-objetos-ilimitados-de-una-clase)
=================================================================================================================



Debes usar algún contenedor, una lista te vale, tu error es que **declaras una nueva lista en cada iteración del ciclo** y se la asignas a la variable `list`. Por tanto, como reasignas un nuevo objeto `list` (vacío) en cada iteración a la variable, la lista que generaste en la iteración anterior se queda sin referencias y el GC la destruye junto al objeto `Animal` que contenía. Al final solo queda viva y asociada a la variable la lista que se creo en la última iteración del ciclo.



```
sortir = False
animals = []      #  <<<<< Declara aquí
while not sortir:
    print("Escull una opció")
    print("1. Crear Animal")
    print("2. Crear Propietari")
    print("3. Mostrar Animals")
    print("4. Mostrar Animals per tipus")
    print("5. Mostrar Propietaris")
    print("6. Fer Log-in")
    print("7. Sortir")

    opcio = int(input("Introdueix la opció: "))
    if opcio == 1:
        nom = input("Introdueix el nom: ")
        nom = nom.lower()
        datanaix = input("Introdueix la data de naixement: ")
        tipus = input("Introdueix el tipus Gos (G), Conill (C) o Serp (S): ")
        tipus = tipus.upper()
        estat = input("Introdueix l'estat, es a dir, si té propietari: ")
        id = tipus + "-" + nom
        obj1 = Animal(nom, datanaix, tipus, estat, id)
        obj1.mostraranimal()
        #obj1.omplediccionari() #no se si esta funcion se tendrá que usar o no
        animals.append(Animal(nom, datanaix, tipus, estat, id))

```

Dos observaciones:


* `list` es una función preconstruida en Python que además permite crear objetos de tipo `list`. No lo uses nunca como nombre de variable, tampoco otras [funciones builtin](https://docs.python.org/3/library/functions.html).


Como mínimo es poco legible y confuso para otros desarrolladores que lean el código. Es fácil deducir con justificada razón, que ante cosas como `bar = foo(list)` a la función se le pasa una referenciara al builtin/tipo `list` y no un objeto `list`. Además, si llegaras a necesitar usar `list` en otra parte del código, tienes un problema, ahora `list` es un objeto `list`, se acabó el poder hacer cosas como : `nueva_lista = list("Hola")`


Si llega a ser necesario usar uno de esos nombres, raro, pero si se da el caso y por legibilidad es oportuno, la convención marca que se debe agregar un guion bajo al final: `list_`.
* El uso de getters en Python no tiene generalmente mucho sentido dado que no existen los atributos privados, es más pitónico acceder directamente al atributo y no crear un método que simplemente lo retorna. Quiźas lo más parecido que hay en Python a getters y setters son las [propiedades](https://es.stackoverflow.com/a/328268/15089).


