Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Primeira explicação - Design Patterns em Python

if name == 'main':

from orcamento import Orcamento

orcamento = Orcamento(500.0) calculador_de_impostos = Calculador_de_impostos() calculador_de_impostos.realiza_calculo(orcamento, 'ICMS') # imprimirá 50 calculador_de_impostos.realiza_calculo(orcamento, 'ISS') # imprimirá 30

Não consegui entender o trecho acima. name e main não são "declaradas" em lugar algum no código, aparecem apenas no if .... não consegui entender.

Sou iniciante em programação, minha área de atuação é infra ... peço desculpas por tantas dúvidas.

Abraço,

8 respostas

A variável name é declara automaticamente pelo Python quando você executa seu código. Quando isso é feito pelo terminal, como você faz nos exercícios, ela ganha o valor 'main'.

Esse if verifica se o valor de name é main e se for roda seu código que testa as classes e funções que você criou.

Isso permite declarar classes e funções no mesmo arquivo que os rodam, tirando a necessidade de criar mais um arquivo.

Dúvida:

Existe a possibilidade de name não ser main neste exemplo?

Não entendi muito bem ... :(

Sim existe, quando você importa o módulo em outro arquivo, como você fez no curso de Python.

Oi Fabrício, agora foi? Se tiver com dúvida, não deixe de postar. Se está tudo certo, não deixe de marcar minha resposta como solução. Isso me libera para ajudar outras pessoas.

Abraço e sucesso no estudo!

Infelizmente não entendi muito bem ... estou pesquisando.

Opa, tirei aqui a explicação, coloquei uma ainda melhor abaixo.

solução!

Opa, eu novamente. Esse é o código final do exercício que tem o IF do mal lá:

# -*- coding: UTF-8 -*-
from descontos import Desconto_por_cinco_itens, Desconto_por_mais_de_quinhentos_reais, Sem_desconto

class Calculador_de_descontos(object):


    def calcula(self, orcamento):

        desconto = Desconto_por_cinco_itens(
            Desconto_por_mais_de_quinhentos_reais(
                Sem_desconto()
            )
        )

        return desconto.calcula(orcamento)

if __name__ == '__main__':

    from orcamento import Orcamento, Item

    orcamento = Orcamento()
    orcamento.adiciona_item(Item('Item A', 100.0))
    orcamento.adiciona_item(Item('Item B', 50.0))
    orcamento.adiciona_item(Item('Item C', 400.0))

    calculador_de_descontos = Calculador_de_descontos()
    desconto = calculador_de_descontos.calcula(orcamento)
    print 'Desconto calculado : %s' % (desconto)
    # imprime 38.5

Como seria a mesma coisa sem precisar usar esse if?

Seu arquivo calculador_de_descontos.py ficaria assim:

# -*- coding: UTF-8 -*-
from descontos import Desconto_por_cinco_itens, Desconto_por_mais_de_quinhentos_reais, Sem_desconto

class Calculador_de_descontos(object):


    def calcula(self, orcamento):

        desconto = Desconto_por_cinco_itens(
            Desconto_por_mais_de_quinhentos_reais(
                Sem_desconto()
            )
        )

        return desconto.calcula(orcamento)

Ok, mas agora, como faço para criar calcular impostos? Precisa de um objeto da classe Calculador_de_impostos e um da classe Orcamento. Eu preciso criar agora outro módulo, vou chamar de main.py. Nele eu preciso importar :orcamento.py e calculador_de_impostos.py

  #mainpy
    from orcamento import Orcamento, Item
    from calculador_de_impostos import Calculador_de_impostos

    orcamento = Orcamento()
    orcamento.adiciona_item(Item('Item A', 100.0))
    orcamento.adiciona_item(Item('Item B', 50.0))
    orcamento.adiciona_item(Item('Item C', 400.0))

    calculador_de_descontos = Calculador_de_descontos()
    desconto = calculador_de_descontos.calcula(orcamento)
    print 'Desconto calculado : %s' % (desconto)
    # imprime 38.5

Veja que o código que está nesse novo arquivo é o conteúdo que estava dentro do IF, com a diferença que tive que importar calculador_de_impostos.py.

Agora, para rodar o meu código, eu preciso executar main.py:

python main.py

Mas já imaginou aprender python e para cada classe que você criar ter que criar um arquivo main1.py, main2.py, etc? Para facilitar a vida do aluno e, no seu caso, fico triste que acabou complicando para você, usamos esse IF.

Agora, vamos voltar a uma pergunta que você me fez. Quando a variável name testada no IF tem valor diferente de main? Quando o arquivo é importado em outro. Só vai ter main se você executar o arquivo pelo terminal em Python.

Vejamos um exemplo. Até aqui tudo bem? Agora vamos voltar para o cenário onde seu calculador_de_impostos.py tem o IF:

# -*- coding: UTF-8 -*-
from descontos import Desconto_por_cinco_itens, Desconto_por_mais_de_quinhentos_reais, Sem_desconto

class Calculador_de_descontos(object):


    def calcula(self, orcamento):

        desconto = Desconto_por_cinco_itens(
            Desconto_por_mais_de_quinhentos_reais(
                Sem_desconto()
            )
        )

        return desconto.calcula(orcamento)

if __name__ == '__main__':

    from orcamento import Orcamento, Item

    orcamento = Orcamento()
    orcamento.adiciona_item(Item('Item A', 100.0))
    orcamento.adiciona_item(Item('Item B', 50.0))
    orcamento.adiciona_item(Item('Item C', 400.0))

    calculador_de_descontos = Calculador_de_descontos()
    desconto = calculador_de_descontos.calcula(orcamento)
    print 'Desconto calculado : %s' % (desconto)
    # imprime 38.5

Beleza, mas mesmo assim, ele tendo o IF e eu podendo executar calculador_de_impostos.py pelo terminal, eu quero criar o main.py e importá-lo. Coisa de doido, mas quero fazer isso mesmo:

#main.py
    from orcamento import Orcamento, Item
    from calculador_de_impostos import Calculador_de_impostos

    orcamento = Orcamento()
    orcamento.adiciona_item(Item('Item A', 100.0))
    orcamento.adiciona_item(Item('Item B', 50.0))
    orcamento.adiciona_item(Item('Item C', 400.0))

    calculador_de_descontos = Calculador_de_descontos()
    desconto = calculador_de_descontos.calcula(orcamento)
    print 'Desconto calculado : %s' % (desconto)
    # imprime 38.5

Veja que em main.py estou importando o módulo calculador_de_impostos.py. Caramba, será que aquele código dentro do IF será executado? Nesse caso não, porque quando usamos import de um módulo, aquela variável name será vazia e se é vazia não será igual a main, correto? Se não é igual main aquele código nunca será executado.

Clareou um pouquinho mais?

Oi Fabricio, aguardo seu Feedback.