Pelo que vi, não existe a figura de classes filhas no código, já que não foi feita herança em nenhum lugar. E pensando bem, os métodos não precisam ser necessáriamente iguais, até porque poderíamos inserir diferentes comportamentos para cada tipo de documento, ex: consultar pontos da CNH, consultar score do CPF, consultar a inscrição municipal de um CNPJ e etc.
from validate_docbr import CPF, CNPJ
class Documento:
@staticmethod
def cria_documento(documento):
if len(documento) == 11:
return DocCpf(documento)
elif len(documento) == 14:
return DocCnpj(documento)
else:
raise ValueError("Quantidade de dígitos incorreta!")
class DocCpf:
def __init__(self, documento):
if self.valida(documento):
self.cpf = documento
else:
raise ValueError("Cpf inválido!")
def __str__(self):
return self.format()
def valida(self, documento):
validador = CPF()
return validador.validate(documento)
def format(self):
mascara = CPF()
return mascara.mask(self.cpf)
class DocCnpj:
def __init__(self, documento):
if self.valida(documento):
self.cnpj = documento
else:
raise ValueError("Cnpj inválido!")
def __str__(self):
return self.format()
def valida(self, documento):
mascara = CNPJ()
return mascara.validate(documento)
def format(self):
mascara = CNPJ()
return mascara.mask(self.cnpj)
E uma dúvida, que não necessariamente tem haver com as perguntas, é: Porque ter a classe Documento(), que serve para chamar as outras classes DocCpf() ou DocCnpj() de acordo com o tamanho do doc, e dentro dessas classes estanciar as classes CPF() e CNPJ() vazias, somente para utilizar o método de validação e formatação? Porque não utilizar uma arquitetura mais simples e direta, já que até essa fase do curso, a gente já viu basicamente tudo que foi criado manualmente na aula?