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

Criador não funciona direito. Mesmo sem passar os argumentos ele permite fazer a Class.

Olá, fiz o código e verifiquei com o do professor e também fiz teste e mudanças, mas o código continua funcionando do jeito errado.

Mesmo sem passar o argumentos obrigatórios e fazendo suas verificações a classe Nota Fiscal é criada com none no lugar dos argumentos não informados. Podem me ajudar? Me mostrar onde estou errando?

Código do builder:

from nota_fiscal import Item, NotaFiscal
from datetime import date

class CriadorDeNotaFiscal(object):

    def __init__(self):
        self.__razao_social = None 
        self.__cnpj = None
        self.__data_de_emissao = date.today 
        self.__detalhes = ''
        self.__itens = None


    def com_razao_social(self, razao_social):
        self.__razao_social = razao_social
        return self

    def com_cnpj(self, cnpj):
        self.__cnpj  = cnpj
        return self

    def com_data_de_emissao(self, data_de_emissao):
        self.__data_de_emissao = data_de_emissao
        return self

    def com_itens(self, itens):
        self.__itens = itens
        return self

    def com_detalhes(self, detalhes):
        self.__detalhes = detalhes 
        return self

    def constroi(self):
        if not self.__razao_social:
            raise Exception('Razão Social deve ser preenchida.')
        if not self.__cnpj:
            raise Exception('CNPJ deve ser preenchida.')
        if not self.__itens:
            raise Exception('Itens deve ser preenchida.')

        return NotaFiscal(
            razao_social    = self.__razao_social, 
            cnpj            = self.__cnpj,
            itens           = self.__itens,
            data_de_emissao = self.__data_de_emissao,
            detalhes        = self.__detalhes)

Código Nota Fiscal:

from datetime import date

class Item(object):

    def __init__(self, descricao, valor):
        self.__descricao = descricao
        self.__valor = valor

    @property
    def descricao(self):
        return self.__descricao

    @property
    def valor(self):
        return self.__valor


class NotaFiscal(object):

    def __init__(self, razao_social, cnpj, itens, data_de_emissao=date.today, detalhes=''):
        self.__razao_social = razao_social
        self.__cnpj = cnpj
        self.__data_de_emissao = data_de_emissao
        if len(detalhes) > 20:
            raise ValueError('Datalhe da nota não pode ter mais de 20 caracteres.')
        else: 
            self.__detalhes = detalhes
        self.__itens = itens

    @property
    def razao_social(self):
        return self.__razao_social

    @property
    def cnpj(self):
        return self.__cnpj

    @property
    def data_de_emissao(self):
        return self.__data_de_emissao

    @property
    def detalhes(self):
        return self.__detalhes


#########################################################################################################3


if __name__ == '__main__':
    from criador_de_nota_fiscal import CriadorDeNotaFiscal

    itens = [
        Item('ITEM A', 100),
        Item('ITEM B', 200)
    ]

    nota_fiscal = NotaFiscal(
        cnpj            = 12345678912345,
        detalhes        =  '',
        data_de_emissao = date.today(),
        itens           = itens,
        razao_social    = 'Brasil Auto Motores, Ltda.',
    )


    nota_fiscal_criada_com_builder =(CriadorDeNotaFiscal()  
                                    .com_cnpj(12345678912345)   
                                    .com_data_de_emissao(date.today())
                                    .com_razao_social('Brasil Auto Motores, Ltda.'))


    print(nota_fiscal_criada_com_builder._CriadorDeNotaFiscal__itens)
1 resposta
solução!

Oii Rafael, como você está? Espero que esteja bem ^-^

Sinto muito pela demora em obter um retorno.

Acredito que esteja acontecendo porque você não está passando os itens da lista e nem chamando o método "constroi" e é partir dele que os dados são passados para as variáveis da classe NotaFiscal, sem ele, a classe NotaFiscal não será instanciada.

Veja como fica a modificação:

nota_fiscal_criada_com_builder =(CriadorDeNotaFiscal()
                                    .com_cnpj(12345678912345)
                                    .com_data_de_emissao(date.today())
                                    .com_itens(itens)
                                    .com_razao_social('Brasil Auto Motores, Ltda.')
                                     .constroi())

Algo que não entendi em seu código foi o seguinte trecho:

 print(nota_fiscal_criada_com_builder._CriadorDeNotaFiscal__itens)

Sua intenção seria retornar os dados da nota fiscal construída? Se sim, você pode apenas chamar as "property" da classe "NotaFiscal", que são responsáveis por retornar os valores instanciados, exemplo:

print(nota_fiscal_criada_com_builder.razao_social)
print(nota_fiscal_criada_com_builder.cnpj)
nota_fiscal_criada_com_builder.itens

Retorno:

Brasil Auto Motores, Ltda.
12345678912345
ITEM A 100
ITEM B 200

No caso acima, precisamos criar uma "property" para retornar os itens da lista que passamos para a NotaFiscal. O código ficará da seguinte forma na classe "NotaFiscal":

@property
    def itens(self):
        return [print(item.descricao, item.valor) for item in self.__itens ]

Com o código acima estamos percorrendo a lista de itens e printando a descrição e o valor de cada um deles (por isso no arquivo "main.py" não colocamos o print ao chamarmos " nota_fiscal_criada_com_builder.itens", pois, dentro da "property" já há um print)

Qualquer dúvida estou por aqui, tá?

Abraços e bons estudos!