1
resposta

Esta metodologia não utiliza classes filhas

Eu achei esse sistema meio furado, porque a classe Documento é completamente desnecessária. Não existe nenhum tipo de relação entre entre DocCpf e DocCnpj, nem deles com Documento (o fato deles terem os mesmo nomes de métodos não significa que existe polimorfismo). Inclusive a classe Documento poderia ser simplesmente uma função:

from cpf_cnpj import criar_documento

exemplo_cpf  = "89525070026"
exemplo_cnpj = "35379838000112"
doc1 = criar_documento(exemplo_cpf)
doc2 = criar_documento(exemplo_cnpj)

print(doc1, doc2)
#class Documento:
#    @staticmethod
def criar_documento(documento):
    if len(documento) == 11:
        return DocCpf(documento)
    elif len(documento) == 14:
        return DocCnpj(documento)
    else:
        raise ValueError("Quantidade de digitos esta incorreta!")

class DocCpf:
#    Mesmo codigo

class DocCnpj:
#    Mesmo codigo
1 resposta

Olá Felipe, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

O código realmente poderia ter sido simplificado, porém, a título de didática e para mostrar para os estudantes as várias possibilidades de se chegar a um resultado, o instrutor optou por realizar algo mais “complexo” por assim dizer. No dia a dia, uma função seria suficiente, mas a título de aplicar a orientação a objetos - paradigma utilizado em várias vertentes da programação, desde códigos mais simples a até mesmo construção de sites, foi feito dessa forma. Já o Polimorfismo, vem de “muitas formas" e a ideia é utilizar nas subclasses o método que tem a mesma assinatura (nome) de formas diferentes. O instrutor partiu do pressuposto que temos uma similaridade de cpf e cnpj, onde ambos são documentos de identificação e a partir disso, surgiu a classe Documento, que redireciona para a criação de um objeto específico (cpf ou cnpj) com base em uma condição, e nessas classes, temos métodos com assinaturas semelhantes, onde muda-se a forma como cada uma se comporta.

Para alavancar ainda mais seus estudos, recomendo o artigo abaixo onde mostra várias formas de implementar o polimorfismo em Python, incluindo o por substituição de métodos:

Em caso de dúvidas me encontro à disposição.

Abraços e bons estudos!