Oi, Juan! Legal sua solução!
Mas repara uma coisa, olha tudo o que você tá fazendo na função formata()
. O ideal é que essa função faça apenas isso, justamente formatar, que é o que você faz na última linha com o print bonitinho. Esses ifs todos são legais para se ter uma data correta, mas talvez não sejam ideais no lugar onde estão. Aliás, será que a gente deveria permitir que o usuário crie uma data que não existe? Se não, não é o caso da gente fazer essas verificações logo quando o usuário tenta criar um objeto Data, ou seja, no método construtor?
Mais uma coisa: Esse código assume que será rodado sempre para uma data cujo ano não é bissexto, não é? Por isso o dia 29 de fevereiro nunca é aceito. Você consegue pensar em um jeito que verifique se o ano é bissexto ou não para permitir (ou não) o dia 29 de fevereiro?