Código
from validate_docbr import CPF, CNPJ
class Documento:
    def __init__(self, documento):
        self.documento = documento
    @staticmethod
    def cria_documento(documento):
        tipos_de_documentos = {
            11: Doc_cpf,
            14: Doc_cnpj,
            20: Doc_qualquer,
        }
        if len(documento) in tipos_de_documentos:
            tipo = tipos_de_documentos[len(documento)]
            return tipo(documento)
        else:
            raise ValueError('Quantidade de dígitos invalidos')
class Doc_qualquer:
    pass
class Doc_cpf:
    def __init__(self, documento):
        documento = str(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):
        format = CPF()
        return format.mask(self.cpf)
class Doc_cnpj(Documento):
    def __init__(self, documento):
        documento = str(documento)
        if self.valida(documento):
            self.cnpj = documento
        else:
            raise ValueError("CNPJ inválido!!")
    def __str__(self):
        return self.format()
    def valida(self, documento):
        validador = CNPJ()
        return validador.validate(documento)
    def format(self):
        format = CNPJ()
        return format.mask(self.cnpj)
Saída
Chamando variáveis no main.py:
from cpf_cnpj import Documento
cpf = '02947859731'
cnpj = '35379838000112'
doc = Documento.cria_documento(cpf)
doc2 = Documento.cria_documento(cnpj)
print(doc)
print(doc2)Saída no Terminal:
029.478.597-31
35.379.838/0001-12Minha Dúvida:
Na minha resolução, na função "cria_documento" eu fiz um dict(pois em teoria com um aumento de documentos seria mais fácil adiciona-los ao invés de encher de if's).
Porém, coloquei os valores da quantidade de caractere dos documentos como chave e o nome das funções como valores do dict, por conta de ser mais simples chamar as chaves depois através do tipo = tipos_de_documentos[len(documento)]. Isso pode ser considerado uma má prática? Já que o mais obvio seria ter os nomes das funções como as chaves e os valores do tamanho do documento como valores.