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

Criação de Objetos e Builder

No caso da utilização do modelo Build, como faço para listar (print) os dados da nota

# -*- coding: UTF-8 -*-
# criador_de_nota_fiscal.py
#este é um objeto criado no modelo utilizando Builder
from datetime import date
from nota_fiscal import Nota_fiscal, Item

class Criador_de_nota_fiscal(object):

    def __init__(self):

        self.__razao_social = None
        self.__cnpj = None
        self.__data_de_emissao = None
        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 constroi(self):
        if self.__razao_social is None:
            raise Exception('Razão social deve ser preenchida')
        if self.__cnpj is None:
            raise Exception('CNPJ deve ser preenchido')
        if self.__itens is None:
            raise Exception('Itens deve ser preenchido')
        if self.__data_de_emissao is None:
            self.__data_de_emissao = date.today()
        if self.__detalhes is None:
            self.__detalhes = ''

        return Nota_fiscal(
            razao_social=self.__razao_social, 
            cnpj=self.__cnpj, 
            itens=self.__itens, 
            data_de_emissao=self.__data_de_emissao, 
            detalhes = self.__detalhes
        )
----
# -*- coding: UTF-8 -*-
# nota_fiscal.py
#este é um modelo de tradicional de criação de objetos no python
#no arquivo criador_de_nota_fiscal.py sera implementado um modelo utilizando Builder
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 Nota_fiscal(object):
    #a informação nos parametros data_de_emissão e detalhes, indica que são parametros opcionais
    #atenção parametros opcionais, no construtor, sempre deve ser informado por ultimo, 
    #caso contrario vai dar erro na execução da aplicação
    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 Exception('Detalhes da nota não pode ter mais do que 20 caracteres')
        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

if __name__ == '__main__':

    from criador_de_nota_fiscal import Criador_de_nota_fiscal

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

    #neste formato poderemos ter problema se inverterem a ordem dos parametros
    #para evitar este tipo de erro, colocamos parametros nomeados e neste caso
    #a ordem que foi informado não importa
    #nota_fiscal = Nota_fiscal(
    #    'FHSA Limitada',
    #    '012345678901234',
    #    itens,
    #    date.today(),
    #    ''
    #)
    nota_fiscal = Nota_fiscal(
        cnpj='012345678901234',
        razao_social='FHSA Limitada',
        itens= itens,
        data_de_emissao=date.today(),
        detalhes=''
    )
    print 'Nota Criada pelo modelo convencional'
    print nota_fiscal.razao_social
    print nota_fiscal.cnpj
    print nota_fiscal.detalhes

    #para passar parametros neste formato tem que estar entre parenteses
    nota_fiscal_criada_com_builder = (Criador_de_nota_fiscal()
                                    .com_razao_social('FHSA Limitada xx')
                                    .com_cnpj('012345678901234')
                                    .com_itens(itens)
                                    .constroi)

    print 'Nota Criada pelo modelo Builder'
1 resposta
solução!

Oi Luis.

Você quer que o builder exiba os dados? Sua finalidade é criar um objeto no final. Quem recebe o objeto faz o que desejar, por exemplo, imprimir.

Se quiser imprimir na classe do Builder só fazer um print básico no método constrói antes de retornar a nota.