Eu recentemente fiz essa atividade e nem de longe pensei em implementar toda essa complexidade, parabéns, haha!
Seu código ficou bom, e bem organizado. Porém, os meses impares só têm 31 dias até agosto, e vice-versa. Tem também a questão dos anos bissextos.
Eu dei umas ajustadas no seu código para implementar essas mudanças, e ficou assim:
class Data:
def __init__(self, dia, mes, ano):
self.dia = dia
self.mes = mes
self.ano = ano
def formatada(self):
# Declaração de variáveis para melhorar a legibilidade:
mes_inexistente = self.mes < 1 or self.mes > 12
ano_bissexto = self.ano % 4 == 0 and self.ano % 100 != 0
fevereiro = self.mes == 2
mes_impar = self.mes % 2 != 0
mes_par = self.mes % 2 == 0
ate_28_dias = self.dia in range(1, 29)
ate_29_dias = self.dia in range(1, 30)
ate_30_dias = self.dia in range(1, 31)
ate_31_dias = self.dia in range(1, 32)
antes_de_agosto = self.mes < 8
depois_de_agosto = self.mes >= 8
# Se o mês é impar e vem antes de agosto, ou é par depois de agosto, tem 31 dias:
mes_31_dias = mes_impar and antes_de_agosto or mes_par and depois_de_agosto
# Se o mês é par e vem antes de agosto (exceto fevereiro), ou é impar e depois de agosto, tem 30 dias:
mes_30_dias = mes_par and not fevereiro and antes_de_agosto or mes_impar and depois_de_agosto
if mes_inexistente: # Se o mes for negativo ou maior que 12
print("Mês não existe")
elif ano_bissexto and fevereiro and ate_29_dias: # Condição para fevereiro em anos bissextos
print(f"{self.dia}/{self.mes}/{self.ano}")
elif not ano_bissexto and fevereiro and ate_28_dias: # Condição para fevereiro em anos não-bissextos
print(f"{self.dia}/{self.mes}/{self.ano}")
elif mes_31_dias and ate_31_dias: # Condiçao para os meses com 31 dias
print(f"{self.dia}/{self.mes}/{self.ano}")
elif mes_30_dias and ate_30_dias: # Condição para os meses com 30 dias
print(f"{self.dia}/{self.mes}/{self.ano}")
else:
print(f"Dia {self.dia} do {self.mes} de {self.ano} não existe")
Essas mudanças tornariam o código bastante ilegível, então eu também fiz uns ajustes na questão de legibilidade, colocando as condições dentro de variáveis e substituindo a função "str.format()" pelo "f".