¡Te damos la bienvenida a este reto!

1

Empezando con Python desde 0

Día 1

2

Variables, funciones y sintaxis básica

3

Tipos de datos: Numbers, Strings y Diccionarios

4

Playground - Retorna el tipo

Día 2

5

Operadores

6

Playground - Calcula la propina

Día 3

7

Condicionales

8

Playground - Averigua si un año es bisiesto

9

Ciclos

10

Playground - Dibuja un triangulo usando bucles

Día 4

11

Listas

12

Encuentra a los gatitos más famosos

13

Diccionarios

14

Obtén el promedio de los estudiantes

15

Tuplas

16

Obten la información de los paquetes

Día 5

17

Calcula la cantidad de letras en una oración

18

Encuentra el mayor palíndromo

Día 6

19

Sets

20

Encuentre la intersección de conjuntos

Día 7

21

List comprehension

22

Encuentra palabras con dos vocales

23

Dictionary Comprehension

24

Calcula la longitud de las palabras

Día 8

25

Funciones Lambda

26

Filtra mensajes de un user específico

27

Higher order functions

28

Crea tu propio método map

Día 9

29

Manejo de Errores y excepciones

30

Maneja correctamente los errores

31

Maneja las excepciones

Día 10

32

Playground - Crea un task manager usando closures

Día 11

33

Lectura de archivos de texto y CSV

Día 12

34

Programación orientada a objetos

35

Crea un auto usando clases

Día 13

36

Abstracción en Python

37

Playground - Crea un sistema de carrito de compras

38

Encapsulamiento en Python

39

Playground - Encapsula datos de los usuarios

Día 14

40

Herencia en Python

41

Playground - Jerarquía de animales usando herencia

Día 15

42

Polimorfismo en Python

43

Playground - Implementa un sistema de pagos

Día 16

44

Estructuras de datos en Python

45

Playground - Crea tu propia lista en python

46

Hash tables en Python

47

Playground - Implementación de una HashTable para Contactos

Día 17

48

Maps en Python

49

Playground - Crea un task manager con Maps

Día 18

50

Singly Linked List en Python

51

Playground - Implementación de una singly linked list

Día 19

52

Stacks en Python

53

Playground - Implementación de un stack

Día 20

54

Queues en Python

55

Playground - Implementación de una queue

Día 21

56

¡Lo lograste!

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Playground - Jerarquía de animales usando herencia

41/56

Aportes 30

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Les dejo mi aporte para que no repitan el objeto en todas las clases

.
.
.
.
.
.

class Animal:
  def __init__(self, name, age, specie):
    self.name = name
    self.age = age
    self.specie = specie
  
  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie
    }
  
class Mammal(Animal):
  def __init__(self, name, age, specie,hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur

  def getInfo(self):
    info = super().getInfo()
    info["hasFur"] = self.hasFur
    return info

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age, "dog",True)
    self.breed = breed

  def getInfo(self):
    info = super().getInfo()
    info["breed"] = self.breed
    return info
    
  def bark(self):
    return "woof!"



Si no fuera por el video de soy dalto, estaría igual que el día que se pidió este reto que fue el Martes 1 Ago 2023, no estoy diciendo que soy un experto, pero ya lo entiendo fácilmente, porque con la explicacioncita que dan en la clase 40 de Herencia en Python no es suficiente (y antes ponían al final esto y mas puedes aprender en el curso de fun…,ahora nada), al menos para alguien como yo que esta empezando de cero en todo.

mi solución:

class Animal:
  # creamos el metodo constructor con sus parametros
  def __init__(self, nombre, edad, especie):
    # definimos lo que le estamos pidiendo que sea igual a cada parametro
    self.nombre = nombre
    self.edad = edad
    self.especie = especie

  def getInfo(self):
    return {
      "nombre": self.nombre,
      "edad": self.edad,
      "especie": self.especie
    }
# creamos la subclase Mamifero que hereda su clase padre Animal(SIN AGRAVIAR)
class Mamifero(Animal):
  # se crea su metodo constructor y se heredan los parametros de la clase padre mas el parametro nuevo
  def __init__(self, nombre, edad, especie, pelaje):
    # para poderlos heredar ocupamos usar super()
    super().__init__(nombre, edad, especie)
    # hacemos referencia al nuevo objeto "pelaje"
    self.pelaje = pelaje

  def getInfo(self):
    info = super().getInfo()
    info["pelaje"] = self.pelaje
    return info

class Perro(Mamifero):
  def __init__(self, nombre, edad, criar):
    super().__inin__(nombre, edad, "perro", True)
    self.criar = criar

  def getInfo(self):
    info = super().getInfo()
    info["criar"] = self.criar
    return info

  def ladrar(self):
    return "woof!! woof!!"

bird = Animal("pepe", 1, "bird")
print(bird.getInfo())

hippo = Mamifero("bartolo", 3, "hippo", False)
print(hippo.getInfo())
class Animal:
  def __init__(self, name, age, specie):
    self.name: str = name
    self.age: int = age
    self.specie: str = specie

  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie
    }

class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur

  def getInfo(self):
    info = super().getInfo()
    info.update({"hasFur": self.hasFur})
    return info

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age, "dog", True)
    self.breed = breed

  def bark(self):
    return "woof!"

  def getInfo(self):
    info = super().getInfo()
    info.update({"breed": self.breed})
    return info
![](https://static.platzi.com/media/user_upload/image-4c7137c3-bd1c-4935-858a-895eafb337ca.jpg) ```python class Animal: def __init__(self, name, age, specie): self._name = name self._age = age self._specie = specie def getInfo (self): return { "name": self._name, "age": self._age, "specie": self._specie } class Mammal(Animal): def __init__(self, name, age, specie, hasFur): super().__init__(name, age, specie) self._hasFur = hasFur def getInfo (self): return { "name": self._name, "age": self._age, "specie": self._specie, "hasFur": self._hasFur } class Dog(Mammal): def __init__(self, name, age, breed): super().__init__(name, age, "dog", True) self._breed = breed def getInfo (self): return { "name": self._name, "age": self._age, "specie": self._specie, "hasFur": self._hasFur, "breed": self._breed } def bark(self): return "woof!" ```

Utilizando dict(**self.__dict__) en la clase padre para el metodo getInfo() ya no tuve necesidad de sobre escribir este metodo en el resto de clases que heredan de la clase padre
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~

class Animal:
  def __init__(self, name, age, specie):
    self.name = name
    self.age = age
    self.specie = specie
    
  def getInfo(self):
    return dict(**self.__dict__)
  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur
  

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age, 'dog', True)
    self.breed = breed

  def bark(self):
    return 'woof!'

bird = Animal("pepe", 1, "bird")
print(bird.getInfo())

hippo = Mammal("bartolo", 3, "hippo", False)
print(hippo.getInfo())

dog = Dog("fido", 4, "pastor aleman");
print(dog.getInfo())
print(dog.bark())

Mi aporte:
Bien contento porque paso el test a la primera. Gracias a Dios 🙏🏼 🎉🎊
.
.

class Animal:
    """Class Animal. Base class"""
    def __init__(self, name, age, specie):
        self.name = name
        self.age = age
        self.specie = specie

    def getInfo(self):
        """Get info method."""
        return {
            'name': self.name,
            'age': self.age,
            'specie': self.specie,
        }


class Mammal(Animal):
    """Class Mammal. SubClass of Class Animal"""
    def __init__(self, name, age, specie, hasFur):
        super().__init__(name, age, specie)
        self.hasFur = hasFur

    def getInfo(self):
        """Get info method"""
        return {
            'name': self.name,
            'age': self.age,
            'specie': self.specie,
            'hasFur': self.hasFur,
        }


class Dog(Mammal):
    """Class Dog. SubClass of Class Mammal"""
    def __init__(self, name, age, breed):
        # super().__init__(name, age, "dog", True)
        super().__init__(name, age, specie="dog", hasFur=True)
        self.breed = breed

    def getInfo(self):
        """Get info method"""
        return {
            'name': self.name,
            'age': self.age,
            'specie': self.specie,
            'hasFur':self.hasFur,
            'breed': self.breed,
        }

    def bark(self):
        """Bark method"""
        return f"woof!"

# Example 1
# bird = Animal("pepe", 1, "bird")
# r = bird.getInfo()
# print(r)
# Ejemplo de uso
bird = Animal("pepe", 1, "bird")
print(bird.getInfo())

dog = Dog("Max", 3, "Labrador")
print(dog.getInfo())
print(dog.bark())
Mi código: ```js . . . . . ``````python class Animal: def __init__(self, name, age, specie): self._name = name self._age = age self._specie = specie @property def name(self): return self._name @name.setter def name(self, new_name): self._name = new_name @property def age(self): return self._age @age.setter def age(self, new_age): self._age = new_age @property def specie(self): return self._specie @specie.setter def specie(self, new_specie): self.specie = new_specie def getInfo(self): return { 'name': self._name, 'age': self._age, 'specie': self._specie, } class Mammal(Animal): def __init__(self, name, age, specie , hasFur): super().__init__(name, age, specie) self._hasFur = hasFur @property def hasFur(self): return self._hasFur @hasFur.setter def hasFur(self, new_hasFur): self._hasFur = new_hasFur def getInfo(self): info = super().getInfo() info['hasFur'] = self._hasFur return info class Dog(Mammal): def __init__(self, name, age, breed): super().__init__(name, age, specie = 'dog', hasFur=True) self._hasFur = True self._breed = breed @property def breed(self): return self._breed @breed.setter def breed(self, new_breed): self._breed = new_breed def getInfo(self): info = super().getInfo() info['breed'] = self._breed return info def bark(self): return 'woof!' ```

Mi aporte:

class Animal:
  def __init__(self, name, age, specie):
    self.name = name
    self.age = age
    self.specie = specie

  def getInfo(self):
    return {
      'name': self.name,
      'age': self.age,
      'specie': self.specie,
    }

class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur

  def getInfo(self):
    return {
      'name': self.name,
      'age': self.age,
      'specie': self.specie,
      'hasFur': self.hasFur,
    }  

class Dog(Mammal):
  def __init__(self, name, age, breed, specie='dog', hasFur=True):
    super().__init__(name, age, specie, hasFur)
    self.breed = breed
  
  def getInfo(self):
    return {
      'name': self.name,
      'age': self.age,
      'specie': self.specie,
      'hasFur': self.hasFur,
      'breed': self.breed,
    }
  
  def bark(self):
    return 'woof!'

Mi aporte:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

class Animal:
  def __init__(self, name, age, specie):
    # Tu código aquí 👇
    self.name = name
    self.age = age
    self.specie = specie
    pass

  def getInfo(self):
    return dict(**self.__dict__)
  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    # Tu código aquí 👇
    super().__init__(name, age, specie)
    self.hasFur = hasFur
    pass

class Dog(Mammal):
  def __init__(self, name, age, breed):
    # Tu código aquí 👇
    super().__init__(name, age, 'dog', True)
    self.breed = breed
    pass

  def bark(self):
    return 'woof!'
class Animal:
  def __init__(self, name, age, specie):
    self.__name = name
    self.__age = age
    self.__specie=specie
    self.__dctanimal={}

  @property
  def age(self):
    return self.__age
  
  @age.setter
  def age(self, valor):
    self.__age = valor

  @property
  def name(self):
    return self.__name
  
  @name.setter
  def name(self, valor):
    self.__name = valor

  @property
  def specie(self):
    return self.__specie
  
  @specie.setter
  def specie(self, valor):
    self.__specie = valor

  def getInfo(self):
    self.__dctanimal["name"]=self.__name
    self.__dctanimal["age"]=self.__age
    self.__dctanimal["specie"]=self.__specie
    return self.__dctanimal

  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    Animal.__init__(self,name, age, specie)
    self.hasfur = hasFur
    self.__dctanimammal={}

  def getInfo(self):
    #self.__dctanimal["name"]=self.__name
    #self.__dctanimal["age"]=self.__age
    #self.__dctanimal["specie"]=self.__specie
    self.__dctanimammal=super().getInfo()
    self.__dctanimammal["hasFur"]=self.hasfur
    return self.__dctanimammal

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age, "dog", True)
    self.breed = breed
    self.__dctanidog ={}

  def getInfo(self):
    #self.__dctanimal["name"]=self.__name
    #self.__dctanimal["age"]=self.__age
    #self.__dctanimal["specie"]=self.__specie
    #self.__dctanimal["hasFur"]=hasFur
    self.__dctanidog=super().getInfo()
    self.__dctanidog["breed"]=self.breed
    return self.__dctanidog
  
  def bark(self):
    #self.__dctanimal["name"]=self.__name
    #self.__dctanimal["age"]=self.__age
    #self.__dctanimal["specie"]=self.__specie
    #self.__dctanimal["hasFur"]=hasFur
    return "woof!"
  
if __name__ == '__main__':
    bird = Animal("pepe", 1, "bird")
    print(bird.getInfo())

    hippo = Mammal("bartolo", 3, "hippo", False)
    print(hippo.getInfo())

    dog = Dog("fido", 4, "pastor aleman")
    print(dog.bark())

🛡️🛡️Escudo anti-spoilers🛡️🛡️

Mi solución al reto:

class Animal:
  def __init__(self, name, age, specie):
    self.name = name 
    self.age = age
    self.specie = specie 

  def getInfo(self):
    return dict(**self.__dict__)

class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur 

  def getInfo(self):
    return {
      **super().getInfo(),
      **self.__dict__
    }

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age, "dog", True)
    self.breed = breed

  def getInfo(self):
    return {
      **super().getInfo(),
      **self.__dict__
  }

  def bark(self):
    return "woof!"

Siempre es más divertido trabajar con perros jajaja
Saludos. 🐶


.
.
.
.
.
.
.
.
.
.

Mi código:

class Animal:
    def __init__(self, name, age, specie):
        self.name = name
        self.age = age
        self.specie = specie

    def getInfo(self):
        return {
            "name": self.name,
            "age": self.age,
            "specie": self.specie
        }

class Mammal(Animal):
    def __init__(self, name, age, specie, hasFur):
        super().__init__(name, age, specie)
        self.hasFur = hasFur

    def getInfo(self):
        info = super().getInfo()
        info["hasFur"] = self.hasFur
        return info

class Dog(Mammal):
    def __init__(self, name, age, breed):
        super().__init__(name, age, "dog", True)
        self.breed = breed

    def getInfo(self):
        info = super().getInfo()
        info["breed"] = self.breed
        return info

    def bark(self):
        return "woof!"


.
.

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


  def getInfo(self):
    return {
       'name': self.name,
       'age' : self.age,
       'specie' : self.specie,
    }


class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur


  def getInfo(self):
    base = super().getInfo()
    base["hasFur"] = self.hasFur
    return base


class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age,'dog', True)
    self.breed = breed


  def getInfo(self):
    base = super().getInfo()
    base["breed"] = self.breed
    return base

  def bark(self):
    return 'woof!'

Mi solución:
.
.
.
.
.
.
.
.
.
.
.
.
.
.

class Animal:
    def __init__(self, name, age, specie):
        self.name = name
        self.age = age
        self.specie = specie

    def getInfo(self):
        return {
            'name': self.name,
            'age': self.age,
            'specie': self.specie
        }
        

class Mammal(Animal):
    def __init__(self, name, age, specie, hasFur):
        super().__init__(name, age, specie)
        self.hasFur = hasFur

    def getInfo(self):
        return super().getInfo() | {'hasFur': self.hasFur}

class Dog(Mammal):
    def __init__(self, name, age, breed):
        super().__init__(name, age, specie = 'dog', hasFur = True)
        self.breed = breed

    def getInfo(self):
        return super().getInfo() | {'breed': self.breed}
    
    def bark(self):
        return 'woof!'

Esta es mi solución, sin embargo cabe resaltar que hay soluciones mejores de otros compañeros en las que heredan el método getInfo() en lugar de reescribirlo completamente.

class Animal:
  def __init__(self, name, age, specie):
    self.name = name
    self.age = age
    self.specie = specie

  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie
    }
  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur

  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie,
      "hasFur": self.hasFur
    }

class Dog(Mammal):
  def __init__(self, name, age, breed, specie="dog", hasFur=True):
    super().__init__(name, age, specie, hasFur)
    self.breed = breed
    self.specie = specie
    self.hasFur = hasFur
  
  def bark(self):
    return "woof!"

  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie,
      "breed": self.breed,
      "hasFur": self.hasFur,
      "specie": self.specie
    }

Solución …
Ejercicio interesante 😄
.

.
.
.
.

class Animal:
  def __init__(self, name, age, specie):
    self.name = name
    self.age = age
    self.specie = specie
  
  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie
    }
  
class Mammal(Animal):
  def __init__(self,name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur
  
  def getInfo(self):
    info = super().getInfo()
    info["hasFur"] = self.hasFur
    return info

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name, age, "dog", True)
    self.breed = breed

  def getInfo(self):
    info = super().getInfo()
    info["breed"] = self.breed
    return info
  
  def bark(self):
    return 'woof!'


.
.
.
.
.
.
.
.

class Animal:
    def __init__(self, name, age, specie):
        self.name = name
        self.age = age
        self.specie = specie

    def getInfo(self):
        return {
            "name": self.name,
            "age": self.age,
            "specie": self.specie
        }

class Mammal(Animal):
    def __init__(self, name, age, specie, hasFur):
        super().__init__(name, age, specie)
        self.hasFur = hasFur

    def getInfo(self):
        info = super().getInfo()
        info["hasFur"] = self.hasFur
        return info

class Dog(Mammal):
    def __init__(self, name, age, breed):
        super().__init__(name, age, 'dog', True)
        self.breed = breed

    def getInfo(self):
        info = super().getInfo()
        info["breed"] = self.breed
        return info

    def bark(self):
        return "woof!"

Aquí mi código, la verdad no entendía que especie se le asignaba el valor ‘dog’ y a hasFur True (algunas veces en las instrucciones viene la solución), además que se me estaba pasando poner el método getInfo en la clase Dog

.
.
.
.
.
.
.
.
.
.
.
.
.
Mi codigo amigos

class Animal:
  def __init__(self,name,age,specie):
    self.name = name
    self.age = age
    self.specie = specie

  def getInfo(self):
    return {"name":self.name,"age":self.age,"specie":self.specie}
  
class Mammal(Animal):
  def __init__(self,name,age,specie,hasFur):
    super().__init__(name,age,specie)
    self.hasFur = hasFur
    
  def getInfo(self):
    return super().getInfo() | {"hasFur":self.hasFur}

class Dog(Mammal):
  def __init__(self,name,age,breed):
    super().__init__(name,age,specie="dog",hasFur=True)
    self.breed = breed

  def getInfo(self):
    return super().getInfo() | {"breed":self.breed}

  def bark(self):
    return "woof!"

class Animal:
    def __init__(self, name, age, specie):
        self.name = name
        self.age = age
        self.specie = specie
    def getInfo(self):
        return {'name': self.name, 'age': self.age, 'specie': self.specie}
  
class Mammal(Animal):
    def __init__(self, name, age, specie, hasFur):
        super().__init__(name, age, specie)
        self.hasFur = hasFur

    def getInfo(self):
        return {'name': self.name, 'age': self.age, 'specie': self.specie, 'hasFur': self.hasFur}

class Dog(Mammal):
    def __init__(self, name, age, breed):
        super().__init__(name, age, 'dog', True)
        self.breed = breed
    def bark(self):
        return "woof!"
    def getInfo(self):
        return {'name': self.name, 'age': self.age, 'specie': self.specie, 'hasFur': self.hasFur, 'breed': self.breed}

dog = Dog("fido", 4, "pastor aleman");
dog.bark()
class Animal:
    def __init__(self, name, age, specie):
        self._name = name
        self._age = age
        self._specie = specie

    def getInfo(self):
       return {
           "name": self._name,
           "age": self._age,
           "specie": self._specie
       }
    
    @property
    def name(self):
        return self._name
    
    @name.setter
    def name(self, name):
        self._name = name

    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, age):
        self._age = age

    @property
    def specie(self):
        return self._specie
    
    @specie.setter
    def specie(self, specie):
        self._specie = specie
    
  
class Mammal(Animal):
    def __init__(self, name, age, specie, has_fur):
        super().__init__(name, age, specie)
        self._has_fur = has_fur

    def getInfo(self):
        return {
           "name": self._name,
           "age": self._age,
           "specie": self._specie,
           "hasFur": self._has_fur
        }

    @property
    def has_fur(self):
        return self._has_fur
    
    @has_fur.setter
    def has_fur(self, has_fur):
        self._has_fur = has_fur
    

class Dog(Mammal):
    def __init__(self, name, age, breed ):
        super().__init__(name, age, "dog", True)
        self._breed = breed
        
    def bark(self):
        return "woof!"

    def getInfo(self):
        return {
           "name": self._name,
           "age": self._age,
           "specie": self._specie,
           "hasFur": self._has_fur,
           "breed": self._breed
        }
    
    @property
    def breed(self):
        return self._breed
    
    @breed.setter
    def breed(self, breed):
        self._breed = breed

Aqui mi codigo:
.
.
.
.
.
.
.
.
.

class Animal:
  def __init__(self, name, age, specie):
    # Tu código aquí 👇
    self.name = name
    self.age = age
    self.specie = specie
  
  def getInfo(self):
    return {'name': self.name, 'age': self.age, 'specie': self.specie}
  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    # Tu código aquí 👇
    super().__init__(name, age, specie)
    self.hasFur = hasFur
  
  def getInfo(self):
    return {'name': self.name, 'age': self.age, 'specie': self.specie, 'hasFur': self.hasFur}

class Dog(Mammal):
  def __init__(self, name, age, breed, specie='dog', hasFur=True):
    # Tu código aquí 👇
    super().__init__(name, age, specie, hasFur)
    self.breed = breed
  
  def bark(self):
    return 'woof!'
  
  def getInfo(self):
    return {'name': self.name, 'age': self.age, 'specie': self.specie, 'hasFur': self.hasFur, 'breed': self.breed}

Lección aprendida copia y pega el nombre de las variables exactas así no estén con el Snake case 🐍🤺


o
o
o
o
o
o
o

class Animal:

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

  def getInfo(self):
    salida = dict()
    salida['name']   = self.name 
    salida['age']    = self.age
    salida['specie'] = self.specie
    return salida

  
class Mammal(Animal):

  def __init__(self, name, age, specie, hasFur):
    super().__init__(name, age, specie)
    self.hasFur = hasFur

  def getInfo(self):
    salida = dict()
    salida['name']   = self.name 
    salida['age']    = self.age
    salida['specie'] = self.specie
    salida['hasFur'] = self.hasFur
    return salida  

class Dog(Mammal):

  def __init__(self, name, age, breed, specie="dog", hasFur=True):
    super().__init__(name, age, specie, hasFur)  
    self.breed = breed

  def getInfo(self):
    salida = dict()
    salida['name']   = self.name 
    salida['age']    = self.age
    salida['specie'] = self.specie
    salida['hasFur'] = self.hasFur
    salida['breed']  = self.breed
    return salida 

  def bark(self):
    return "woof!"


bird = Animal("pepe", 1, "bird")
print(bird.getInfo())

hippo = Mammal("bartolo", 3, "hippo", False)
print(hippo.getInfo())

dog = Dog("fido", 4, "pastor aleman");
print(dog.bark())
print(dog.getInfo())   

Mi solución:
*
*
*
*
*
*
*
*
*
*

class Animal:
  def __init__(self, name, age, specie):
    # Tu código aquí 👇
    self.name = name
    self.age = age
    self.specie =specie
  
  def getInfo(self):
    return {'name': self.name, 'age': self.age, 'specie': self.specie}
  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    # Tu código aquí 👇
    super().__init__(name, age, specie)
    self.hasFur = hasFur
  
  def getInfo(self):
    return {'name': self.name,'age': self.age, 'specie': self.specie, 'hasFur': self.hasFur }

class Dog(Mammal):
  def __init__(self, name, age, breed):
    # Tu código aquí 👇
    super().__init__(name, age, specie ='dog', hasFur=True)
    self.breed = breed

  def getInfo(self):
    return {'name': self.name,'age': self.age, 'specie': self.specie, 'hasFur': self.hasFur, 'breed': self.breed}  

  def bark(self):
    return 'woof!' 


.
.
.
.
.


.
.
.
.
.

class Animal:
  def __init__(self,name,age,specie):
    self._name = name
    self._age = age
    self._specie = specie
  
  def getInfo(self):
    return {
      "name" : self._name,
      "age" : self._age,
      "specie" : self._specie
    }
  
class Mammal(Animal):
  def __init__(self,name,age,specie,hasFur):
    super().__init__(name,age,specie)
    self._hasFur = hasFur
  
  def getInfo(self):
    info =  super().getInfo()
    info['hasFur'] = self._hasFur
    return info

class Dog(Mammal):
  def __init__(self, name, age, breed):
    super().__init__(name,age,"dog",True)
    self._breed = breed
  
  def getInfo(self):
    info =  super().getInfo()
    info['breed'] = self._breed
    return info
  
  def bark(self):
    return "woof!"

SPOILER
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

class Animal:
  def __init__(self, name, age, specie):
    # Tu código aquí 👇
    self.name = name
    self.age = age
    self.specie = specie
    pass
  
  def getInfo(self):
    return {
      "name": self.name,
      "age": self.age,
      "specie": self.specie
    }
  
class Mammal(Animal):
  def __init__(self, name, age, specie, hasFur):
    # Tu código aquí 👇
    super().__init__(name, age, specie)
    self.hasFur = hasFur
    pass

  def getInfo(self):
    info = super().getInfo()
    info["hasFur"] = self.hasFur
    return info

class Dog(Mammal):
  def __init__(self, name, age, breed):
    # Tu código aquí 👇
    super().__init__(name, age, "dog", True)
    self.breed = breed
    pass

  def getInfo(self):
    info = super().getInfo()
    info["breed"] = self.breed
    return info

  def bark(self):
    return "woof!"
undefined