3
respostas

'DocCnpj' object has no attribute 'documento'

Criei o código conforme explicado pelo instrutor, mas está resultando no erro 'DocCnpj' object has no attribute 'documento'

class Documento:

@staticmethod
def cria_documento (documento):
    doc_str = str(documento)
    if len(doc_str) == 11:
        return DocCpf()
    elif len(doc_str) == 14:
        return DocCnpj()
    else:
        raise ValueError ('Quantidade de dígitos inválida')

class DocCpf: def init_(self, documento): if self.valida(documento): self.documento = documento else: raise ValueError ('Cpf inválido')

def __str__(self):
    return self.formata()

def valida(self,documento):
    validador = CPF()            
    return validador.validate(documento)


def formata(self):
    mascara = CPF()
    return mascara.mask(self.documento)

class DocCnpj: def init_(self, documento): if self.valida(documento): self.documento = documento else: raise ValueError ('Cnpj inválido')

def __str__(self):
    return self.formata()

def valida(self,documento):
    validador = CNPJ()            
    return validador.validate(documento)


def formata(self):
    mascara = CNPJ()
    return mascara.mask(self.documento)
3 respostas

Nessa parte vc deveria passar doc_str para o DocCpf() e para o DocCnpj(). Assim eles serão devidamente construidos e terão um atributo documento, ou então levantarão um erro se for inválido.

class Documento:
    @staticmethod
    def cria_documento (documento):
        doc_str = str(documento)
        if len(doc_str) == 11:
            return DocCpf(doc_str) # <--
        elif len(doc_str) == 14:
            return DocCnpj(doc_str) # <--
    ...

Se passo o doc_str para o DocCpf() e para o DocCnpj() retorna o seguinte erro TypeError: DocCnpj() takes no arguments

Eu testei o código que vc postou com essa modificação que eu propus e rodou sem problemas aqui.

Confira se o construtor das suas classes está de fato aceitando um argumento: def __init__(self, documento). Segue o código que testei:

from validate_docbr import CPF, CNPJ


class Documento:
    @staticmethod
    def cria_documento(documento):
        doc_str = str(documento)
        if len(doc_str) == 11:
            return DocCpf(doc_str)
        elif len(doc_str) == 14:
            return DocCnpj(doc_str)
        else:
            raise ValueError('Quantidade de dígitos inválida')


class DocCpf:
    def __init__(self, documento):
        if self.valida(documento):
            self.documento = documento
        else:
            raise ValueError('Cpf inválido')

    def __str__(self):
        return self.formata()

    def valida(self, documento):
        validador = CPF()
        return validador.validate(documento)

    def formata(self):
        mascara = CPF()
        return mascara.mask(self.documento)


class DocCnpj:
    def __init__(self, documento):
        if self.valida(documento):
            self.documento = documento
        else:
            raise ValueError('Cnpj inválido')

    def __str__(self):
        return self.formata()

    def valida(self, documento):
        validador = CNPJ()
        return validador.validate(documento)

    def formata(self):
        mascara = CNPJ()
        return mascara.mask(self.documento)


# Printa o documento formtado
cpf_valido = Documento.cria_documento(90048280011)
print(cpf_valido)

# Printa o documento formtado
cnpj_valido = Documento.cria_documento(86449670681625)
print(cnpj_valido)

# Dá um erro de cpf inválido (descomentar para testar)
# cpf_invalido = Documento.cria_documento(90048280012)

# Dá um erro de cnpj inválido (descomentar para testar)
# cnpj_valido = Documento.cria_documento(86449670681626)