Puedes decirme por qué el siguiente código en python o funciona?

class Animal:
    def __init__(self, nombre, tipo):
        self.nombre = nombre
        self.tipo = tipo

    def saludar_animal():
        print(f'Hola {self.nombre}')

mi_animal = Animal('zeus', 'perro')
mi_animal.saludar_animal()
Claro que sí, con mucho gusto lo haré 😃.

Si te fijas en la función saludar_animal verás que está dentro de la clase Animal pero no incluye el parámetro self en ella, esto provoca que la función pertenezca a la clase pero no pueda acceder a los objetos que pertenecen a esta, también provocará que no pueda ser llamada por instancias de la clase, sino unicamente por la clase misma.

De esta manera, cuando creas la instancia mi_animal de la clase Animal e intentas llamar el método saludar_animal resultará en un error.
Basta con agregar self como parámetro al método saludar_animal, quedando el código de la siguiente forma:

class Animal:
    def __init__(self, nombre, tipo):
        self.nombre = nombre
        self.tipo = tipo

    def saludar_animal(self):
        print(f'Hola {self.nombre}')

mi_animal = Animal('zeus', 'perro')
mi_animal.saludar_animal()

Espero haber sido de ayuda. ¡Si tienes alguna otra duda sobre tu código no dudes en preguntarme!