Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida na impressao de uma classe

Minha dúvida no final da página!

Código:

class Documento:
    def __init__(self, documento):
        self.documento = documento
        self.valida_documento()

    def valida_documento(self):
        if (len(self.documento) == 11):
            return DocCpf(self.documento)
        elif (len(self.documento) == 14):
            return DocCnpj(self.documento)
        else:
            raise ValueError("Quantidade de números inválida!")

class DocCpf:
    def __init__(self, documento):
        self.documento = documento
        self.validacao_cpf()

    def validacao_cpf(self):
        import re

        numeros = [int(digito) for digito in self.documento if digito.isdigit()]
        soma_produtos = sum(a*b for a, b in zip(numeros[0:9], range(10, 1, -1)))
        digito_esperado = (soma_produtos * 10 % 11) % 10
        if numeros[9] == digito_esperado:
            soma_produtos1 = sum(a*b for a, b in zip(numeros [0:10], range (11, 1, -1)))
            digito_esperado1 = (soma_produtos1 *10 % 11) % 10
            if numeros[10] == digito_esperado1:
                return self.documento
        raise ValueError("CPF inválido!")

    def __str__(self):
        return f"{self.documento[:3]}.{self.documento[3:6]}.{self.documento[6:9]}-{self.documento[9:]}"

class DocCnpj:
    def __init__(self, documento):
        self.documento = documento

    def __str__(self):
        return f"{self.documento[:2]}.{self.documento[2:5]}.{self.documento[5:8]}/{self.documento[8:12]}-{self.documento[12:]}"  
    

Primeiro método:

cpf = "07650262367"
teste = Documento(cpf)
print(teste)

"Saída ERRADA: <__main__.Documento object at 0x00000190D6D37530>"

Segundo método:

cpf = "07650262367"
teste = Documento(cpf)
print(teste.valida_documento())

"Saída CORRETA: 076.502.623-67"

Minha dúvida: Gostaria de obter a saída correta (como mostra no segundo método) sem precisar chamar a função 'valida.documento()', tentei fazer isso no primeiro método mas a saída foi errada, gostaria que a classe 'Documento' já iniciasse essa função automaticamente. O que devo mudar no codigo para que isso seja possível? (Por favor, ignore a classe 'DocCnpj' pois ainda não está pronta, minha duvida está relacionada apenas as classes 'Documento' e 'DocCpf')

1 resposta
solução!

Oi

Para obter a saída correta sem precisar chamar explicitamente a função valida_documento(), você pode realizar algumas alterações no código. Uma abordagem seria chamar a função de validação no construtor da classe Documento. No entanto, é importante notar que a função valida_documento() deve ser ajustada para retornar uma instância da classe DocCpf em vez de apenas o número do CPF validado.

class Documento:
    def __init__(self, documento):
        self.documento = documento
        self.doc_instance = self.valida_documento()

    def valida_documento(self):
        if len(self.documento) == 11:
            return DocCpf(self.documento)
        elif len(self.documento) == 14:
            return DocCnpj(self.documento)
        else:
            raise ValueError("Quantidade de números inválida!")

    def __str__(self):
        return str(self.doc_instance)

class DocCpf:
    def __init__(self, documento):
        self.documento = documento
        self.validacao_cpf()

    def validacao_cpf(self):
        import re

        numeros = [int(digito) for digito in self.documento if digito.isdigit()]
        soma_produtos = sum(a * b for a, b in zip(numeros[0:9], range(10, 1, -1)))
        digito_esperado = (soma_produtos * 10 % 11) % 10
        if numeros[9] == digito_esperado:
            soma_produtos1 = sum(a * b for a, b in zip(numeros[0:10], range(11, 1, -1)))
            digito_esperado1 = (soma_produtos1 * 10 % 11) % 10
            if numeros[10] == digito_esperado1:
                return

        raise ValueError("CPF inválido!")

    def __str__(self):
        return f"{self.documento[:3]}.{self.documento[3:6]}.{self.documento[6:9]}-{self.documento[9:]}"

class DocCnpj:
    def __init__(self, documento):
        self.documento = documento

    def __str__(self):
        return f"{self.documento[:2]}.{self.documento[2:5]}.{self.documento[5:8]}/{self.documento[8:12]}-{self.documento[12:]}"

# Teste
cpf = "07650262367"
teste = Documento(cpf)
print(teste)

Agora, ao criar uma instância da classe Documento, a função valida_documento() é chamada automaticamente, e você pode obter a saída desejada diretamente.