Oii, Marinaldo!
Seu código tá muito bem feito e mostra que você entendeu bem os conceitos de orientação a objetos em Python. A organização das classes e métodos está clara, o uso do Enum
para os estados da conta deixou o sistema mais legível e as exceções personalizadas mostram uma boa preocupação com regras de negócio e tratamento de erros. Também achei uma boa escolha usar propriedades para proteger o acesso a atributos importantes como saldo e estado da conta.
O extrato formatado com a biblioteca tabulate
foi um detalhe que trouxe bastante valor, porque deixa o resultado muito mais profissional e fácil de entender. E, a parte final no bloco if __name__ == "__main__":
dá uma visão completa do fluxo do programa, o que é ótimo para demonstrar o funcionamento.
Continue firme nos estudos.