2
Linguagens de Programação
UFGD
4
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
7
Linguagens de Programação
UFGD
2
Linguagens de Programação
UFGD
2
Linguagens de Programação
UFGD
2
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
Texto de pré-visualização
Linguagem de Programação I Tutorial 1 115 Classes e Objetos 1 Instalação da Linguagem de Programação e do Ambiente de Desenvolvimento Duas características principais são responsáveis pela enorme popularidade do paradigma orientado a objetos a o mapeamento de entidades do mundo real em unidades de programação que são utilizadas como novos tipos da linguagem e b e capacidade de definir unidades de programação com dados e métodos funções que acessam esses dados comuns em unidades mais genéricas e herdálos em outras unidades mais especializadas Python é uma linguagem orientada a objetos cuja utilização tem crescido muito atualmente Suas principais características são independência de plataforma gerenciamento automático da utilização de memória e transparência no endereçamento de memória Python provê uma plataforma de desenvolvimento com uma extensa API Application Program Interface que suporta diversas funcionalidades Várias outras linguagens suportam o paradigma orientado a objetos como por exemplo Java C PHP JavaScript Python Pearl Delphi C Visual Basic Dominar o paradigma orientado a objetos é muito útil no aprendizado de outras linguagens A manipulação de conjuntos de dados em Python é muito poderosa favorecendo a criação de um código compacto e versátil o que tem contribuido para grande popularidade atual desta linguagem Além disso esta linguagem está sendo largamente utilizada para o desenvolvimento de software científico como por exemplo aprendizado de máquinas machine learning e aprendizado profundo deep learning que estão potencializando aplicações muito bem sucedidas na área de inteligência artificial Para fixar os conceitos que serão apresentados neste tutorial é fundamental que cada trecho de código apresentado seja implementado e testado Desta forma será necessário instalar a versão estável mais recente do Python e a versão mais recente do IDE Integrated Development Environment Ambiente de Desenvolvimento Integrado PyCharm da Jet Brains No site httpswwwpythonorg selecione a opção Downloads baixe e instale no seu computador o arquivo executável da versão mais recente do Python para Windows por exemplo python3115 amd64 No site httpswwwjetbrainscomptbrpycharm selecione a opção Baixar e novamente esta opção para a baixar a versão gratuita Community do PyCharm baixe e instale em seu computador o arquivo executável da versão mais recente do PyCharm Community por exemplo pycharm community202321 Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 215 Para implementar e testar os trechos de código das seções 3 e 4 deste tutorial que ilustram conceitos básicos da linguagem Python crie um projeto no IDE PyCharm com o nome MPE1 selecione File New Project na janela Create Project mantenha a seleção de New environment using para criar um ambiente específico para o seu projeto em Location navegue para escolher um diretório para armazenar o seu projeto complete o diretório com o nome do projeto MPE1 em Basic Interpreter selecione a versão Python 311 mantenha a seleção de Create a mainpy welcome script finalize a criação ativando o botão Create Crie um diretório padrão para armazenar os diretórios e módulos arquivos fontes do seu projeto selecione a aba Project no canto esquerdo da tela para visualizar a janela lateral Project clique na linha com o nome do seu projeto e selecione com o botão direito do mouse New Directory preencha com o nome src abreviação para source diretório onde tradicionalmente são armazenados os arquivos fontes do projeto em geral organizados em subdiretórios de src assinale o diretório src como raiz dos arquivos fontes do projeto selecione o diretório src com o botão direito do mouse escolha a opção Mark Directory as Mark as Source Root selecione o arquivo mainpy e movao para o diretório src Ajuste o arquivo mainpy na janela de projeto lateral esquerda clique no arquivo mainpy para visualizar o seu código na janela à direita da janela de projeto remova a seleção de ponto de parada para teste passo a passo debug clicando no círculo vermelho no lado esquerdo de uma das linhas do código remova todos os comentários strings iniciados com o caracter altere o código do arquivo mainpy para ficar da seguinte forma def imprimirlinguagemprogramação printfVamos aprender a programar na linguagem linguagemprogramação if name main imprimirPython Execute o programa clicando na seta verde no canto superior direito da sua janela Você visualizará o resultado do processo na janela Run execução Vamos aprender a programar na linguagem Python Process finished with exit code 0 Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 315 O código em Python é organizado em blocos de comandos Diferentemente de outras linguagens como Java C e C bloco em Python não são delimitados por e sim por identação utilizando Tab Portanto você deve estar muito atento para que a identação de seu código esteja correta Na execução o Python atribui à variável prédefinida name o string main e executa o corpo principal do programa que neste caso tem somente o comando condicional if Variáveis prédefinidas são cercadas por duplo underline como é o caso da variável name O comando condicional if testa com sucesso que a variável name é igual ao contém o mesmo valor que string main Pelo fato do teste do comando if ser bem sucedido o seu corpo interno de comandos é executado neste exemplo somente a chamada da função imprimir passando como argumento o string Python A função imprimir recebe o parâmetro entre parênteses linguagemprogramação para o qual foi atribuído como argumento o string Python Ao ser chamada a função executa o seu corpo interno de comandos que neste exemplo é composto somente pela chamada da função prédefinida builtin print utilizada para imprimir strings Funções prédefinidas são disponíveis em Python sem que seja necessário definilas O argumento passado para a função print é um string formatado f para compor trechos fixos Vamos aprender a programar na linguagem e com trechos variáveis entre chaves O trecho variável recebe o valor passado como argumento Python para o parâmetro linguagemprogramação Como resultado é impresso na tela do seu computador o string Vamos aprender a programar na linguagem Python O resultado da execução é mostrado na janela de execução Run Adicionalmente como mensagem de final de execução é impressa a mensagem Process finished with exit code 0 cuja tradução é Processo concluído com código de saída 0 O código 0 indica que a execução foi concluída com sucesso Caso seja reportado o código 1 a mensagem indica execução mal sucedida Esta mensagem se repete em todas as execuções e será omitida nas ilustrações da seção 2 Este exemplo muito simples com uma breve explicação é o seu primeiro contato com a execução de um programa em Python Na próxima seção vamos conceituar a primeira etapa de um projeto de referência 2 Implementação de Entidades Sem Relacionamentos Nos tutoriais dessa disciplina é adotado o modelo de aprendizado a partir de um projeto de referência cujo código se inicia neste tutorial e cresce incrementalmente até atingir o projeto completo no Tutorial 4 Desta forma a especificação do projeto definida no Tutorial Auxiliar A Especificação de um Projeto Orientado a Objetos de Referência será implementada ao longo dos quatro tutoriais da disciplina Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 415 Neste ponto é importante observar uma diferença fundamental entre Python e outras linguagens de programação como C C e Java Python é uma linguagem com tipagem dinâmica o que significa que você não especifica o tipo de dado sendo definido Esse tipo será inferido durante a execução do código Vamos considerar por exemplo que os valores atribuídos a uma variável podem ser dos seguintes tipos str string ex disciplina Metologia de Programação int inteiro positivo ou negativo ex cargahorária 72 float ponto flutuante positivo ou negativo ex notamínimaaprovação 60 bool boolean com valores True ou False ex disciplinaobrigatória True Cada entidade do mundo real é mapeada em uma classe de objetos denominada simplesmente como classe em uma linguagem de programação orientada a objetos Uma classe é composta de dados que mapeiam atributos do mundo real Uma classe é um tipo complexo composto de vários dados que estende os tipos comuns da linguagem de programação inteiro int flutuante float booleno bool string str acrescentando tipos mapeados a partir das entidades do mundo real relevantes para um dado projeto de software Assim como podemos criar uma variável inteira flutuante números com casas decimais booleana ou string podemos criar variáveis a partir de uma classe Essas variáveis são denominadas objetos e em geral são inicializadas com valores para os atributos da classe Vamos adotar a seguinte metodologia para você entender cada trecho de código que será apresentado a primeiro ilustramos o trecho de código e b em seguida vamos explicar cada novo conceito que ele apresenta Mesmo que você já conheça alguns desses conceitos não pule nada Leia tudo com atenção e releia se for necessário até ficar claro para você Alguns conceitos serão comentados mais de uma vez mas isso é bom para fixar bem o entendimento a respeito No Tutorial Auxiliar Especificação de um Projeto Orientado a Objetos de Referência foi especificado o projeto Divulgação de Lançamentos de Veículos que servirá de referência para a especificação dos projetos individuais dos alunos e terá seu código desenvolvido incrementalmente nos 4 tutoriais dessa disciplina A leitura do Tutorial Auxiliar é um prérequisito para a leitura do Tutorial 1 Os relacionamentos entre das entidades do projeto Divulgação de Lançamentos de Veículos são os seguintes Entidades sem relacionamentos Veículo AgênciaPublicidade Agregação Montadora Veículo Associação Lançamento Montadora Veículo AgênciaPublicidade Herança Veículo Carro Caminhão Delegação Lançamento Data Neste tutorial vamos ilustrar a implementação das entidades sem relacionamentos Veículo e AgênciaPublicidade Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 515 No módulo veículo do diretório entidades vamos definir a classe Veículo Observe que a classe Veículo mapeia em uma unidade computacional classe uma entidade que você encontra no mundo real e que seus atributos marcamodelo alimentação potência importado também mapeiam características de um veículo que você encontra no mundo real class Veículo def initself marcamodelo alimentação potência importado selfmarcamodelo marcamodelo selfalimentação alimentação if alimentação in flex diesel elétrico else indefinida selfpotência potência selfimportado importado A palavra reservada class classe é utilizada para definir uma classe cujo nome deverá utilizar a primeira letra maíscula ex Carro ou um nome composto de palavras com a primeira letra maiúscula ex OficinaMecânica Nomes de diretórios módulos funções e variáveis utilizam somente letras minúsculas ex nome também separando palavras por underline ex datanascimento A palavra reservada def abreviação para define function é utilizada para definir o método init Funções podem ser utilizadas para obter armazenar ou computar dados a partir de outros dados Funções internas a uma classe são chamadas de métodos no jargão orientado a objetos Métodos padronizados em Python tem seu nome cercado por dois underlines como por exemplo o método init Os atributos da classe são inicializados neste método que é chamado quando o objeto é construído Por esse motivo os métodos init utilizados para construir objetos nas classes são chamados de construtores Esse método tem em geral um parâmetro para cada atributo do objeto que será inicializado na sua construção Todos os métodos de uma classe tem como primeiro parâmetro a palavra reservada self próprio para indicar que todo método da classe tem acesso a todos os dados da classe que são prefixados por self ex selfmarcamodelo Os demais parâmetros do método init são utilizados para inicializar os atributos da classe ex selfmarcamodelo marcamodelo O caracter é utilizado para atribuir valores ou expressões a uma variável O atributo selfalimentação é considerado um enumerado ou seja uma variável que pode assumir um valor definido em uma lista de valores Neste caso é importante verificar utilizando um comando if se associado ao comando de atribuição se o valor passado como parâmetro pertence à lista de valores possíveis correspondendo aos tipos de alimentação utilizadas em um veículo selfalimentação alimentação if alimentação in flex diesel elétrico else indefinida O comando if é um teste condicional utilizado para testar um condição Por exemplo se queremos testar se um string não é nulo None antes de imprimilo É necessário utilizar o separador após a condição do if se e após o else senão Se a condição for verdadeira o bloco de comandos que segue logo após o separador localizado após condição será executado Caso contrário será executado o bloco de comando que segue logo após o else Ao comparar com None não utilizamos ou utilizados para comparar com variáveis ou valores do tipo int float bool ou str e sim is ou is not if marcamodelo is not None printmarcamodelo else print marca modelo com valor nulo Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 615 No exemplo anterior o bloco de comandos associado à condição verdadeira do if ou à condição falsa else tem um único comando Neste caso particular utilizaremos neste tutorial os comandos na mesma linha do if e do else mas você pode optar pela formatação que deseja utilizar if marcamodelo is not None printmarcamodelo else print marca modelo com valor nulo É muito útil que um objeto seja identificado unicamente pelo valor do seu atributo chave Para classes representando pessoas ex Cliente Funcionário Aluno Médico o atributo chave mais utilizado é o CPF uma vez que identifica uma pessoa unicamente em todo o território nacional No entanto dependendo da aplicação podemos utilizar o nome da pessoa desde que não exista outra pessoa com o mesmo nome no projeto No caso do projeto Divulgação de Lançamentos de Veículos o lançamento de um veículo com uma determinada marca modelo será divulgado uma única vez quando for lançado pela primeira vez no mercado brasileiro Desta forma a marca modelo do veículo lançado servirá como chave para diferenciálo de todos os outros lançamentos Estamos assumindo que a montadora do veículo que será lançado contratará uma agência de publicidade para divulgar o seu lançamento No módulo agênciapublicidade do diretório entidades vamos definir a entidade AgênciaPublicidade do mundo real em sua unidade computacional a classe AgênciaPublicidade class AgênciaPublicidade def initself nome paísorigem rankingavaliação selfnome nome selfpaísorigem paísorigem selfrankingavaliação rankingavaliação 3 Método para gerar um String representando os Atributos do Objeto Após cadastrar vários objetos de uma dada classe é muito comum desejarmos imprimir os dados de cada objeto cadastrado Para o obter o string que representa os atributos do objeto criado utilizamos o método padronizado str A seguir vamos o acrescentar o método str na classe Veículo e na classe AgênciaPublicidade omitindo somente para economizar espaço no Tutorial o método init que é sempre o primeiro método a ser implementado na classe class Veículo def strself if selfimportado importadostr importado else importadostr formato 19 8 6 veículoformatado formatoformat selfmarcamodelo selfalimentação fselfpotência3d cv importadostr return veículoformatado Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 715 O método str não tem parâmetros dado que sua função é gerar um string a partir dos atributos da classe Em geral os valores dos atributos da classe que serão impressos serão representados por strings de tamanhos diferentes ex marca modelo de veículos Para tornar a impressão mais amigável é interessante alinhar cada coluna de valores a ser impressa No caso de veículos as colunas são marcamodelo alimentação potência e importado Python suporta a definição do formato que será utilizado para imprimir cada objeto Esse formato é definido por um string contendo para cada coluna a ser impressa calculado como o tamanho do maior valor a ser impresso em cada coluna acrescido de alguns espaços para separar as colunas No primeiro comando do método str vemos a sintaxe utilizada para definir o formato de impressão assinalando o espaço de cada uma das quatro colunas a serem impressas para cada objeto da classe Veículo O caracter é utilizado para indicar indentação à esquerda ou seja todos os valores de uma dada coluna serão alinhados no inicio de cada string da coluna Se a escolha tivesse sido indentação à direita seria utilizado o caracter e neste caso todos os valores de uma dada coluna seriam alinhadas ao final de cada string da coluna Após a definição do string do formato o método format suportado pelo Python é aplicado ao formato recebendo como parâmetros os strings de cada coluna a ser impressa Desta forma os atributos que não são strings ex idade e peso foram convertidos para string pela utilização da função str prédefinida pelo Python Os valores da coluna potência dos veículos que serão cadastrados poderão ocupar 2 ou 3 dígitos Para alinhar esses valores à esquerda é possível utilizar o formatador f informando quantos caracteres deverão ser impressos neste caso 3 caracteres 3d Para separar as colunas da impressão dos objetos é utilizado o caracter Para esse caracter não é necessário definir a quantidade de caracteres utilizando somente Quando uma classe tiver um atributo do tipo bool o mais recomendado é formatar o seu valor na última coluna e mostrálo somente quando seu valor for True Observe que no método str foi testado se o valor do atributo importado é True e neste caso é incluída uma coluna com a palavra importado Caso contrário o valor é omitido o que mais amigável do que mostrar não importado para a maioria dos veículos que não são importados Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 815 A seguir vamos ilustrar o método str da classe AgênciaPublicidade class AgênciaPublicidade def strself formato 10 14 1 agênciapublicidadeformatada formatoformat selfnome selfpaísorigem strselfrankingavaliação return agênciapublicidadeformatada 4 Conjuntos para Armazenar Objetos da Classe A forma mais simples de armazenar objetos variáveis criadas a partir de uma classe novo tipo da aplicação que mapeia uma entidade do mundo real é definir uma variável global pode ser utilizada por toda a aplicação utilizando o nome da classe no plural ex veículos agênciaspublicidade dado que irá armazenar um conjunto de objetos Python suporta uma estrutura de dados denominada lista Os itens ex objetos da classe Veículo armazenados na lista exveículos podem ser consultados por índices na ordem em que foram armazenados ex veículosn onde varia de 0 até o número de itens da lista menos 1 No módulo veículo definimos antes da definição da classe Veículo o conjunto de objetos veículos e suas funções associadas veículos def getveículos return veículos def inserirveículoveículo veículosappendveículo O conjunto veículos é inicializado com uma lista vazia A função getveículos retorna o conjunto de veículos A função inserirveículo recebe um objeto veículo e apenda na lista veículos Pelo fato de cada função ter um único comando optamos por definilo na mesma linha da definição da função No entanto se você preferir pode indentálo na próxima linha da função def getveículos return veículos A seguir implementamos no módulo agênciapublicidade antes da classe AgênciaPublicidade o conjunto de objetos agênciaspublicidade e suas funções associadas agênciaspublicidade def getagênciaspublicidade return agênciaspublicidade def inseriragênciapublicidadeagênciapublicidade agênciaspublicidadeappendagênciapublicidade 5 Utilizando Filtros para Selecionar um Subconjunto de Objetos Para que um projeto seja útil para os usuários ele deve suportar a filtragem dos objetos cadastrados No módulo veículo vamos acrescentar a função selecionarveículos def selecionarveículosimportadoNone alimentaçãoNone potênciamáximaNone filtros Filtros if importado filtros importado elif importado False filtros nacional Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 915 if alimentação is not None filtros alimentação alimentação if potênciamáxima is not None filtros potência máxima strpotênciamáxima veículosselecionados for veículo in veículos if importado in True False and veículoimportado importado continue if alimentação is not None and veículoalimentação alimentação continue if potênciamáxima is not None and veículopotência potênciamáxima continue veículosselecionadosappendveículo return filtros veículosselecionad Antes de detalhar a função de filtragem vamos comentar o uso dos comandos if e for que são utilizados nessa função Vimos anteriormente que o teste condicional if pode ser utilizado com a palavra reservada else para indicar o bloco de ações que será realizado se a condição que está sendo testada pelo if não for satisfeita No entanto na função de filtragem caso a condição do if não seja aceita será necessário testar uma outra condição dado que o valor do parâmetro importado poderá ser None True ou False Neste caso é utilizada a palavra reservada elif que é uma contração para as palavras else if senão se associada a uma segunda condição Na situação mais geral um comando condicional pode testar várias condições utilizando um if para testar a primeira condição vários elif para testar as demais condições e um else se nenhuma das condições for aceita O comando for é utilizado para testar uma condição que resultará na repetição da execução de um bloco de comandos enquanto a condição testada permanecer verdadeira O comando for utilizado conjuntamente com a palavra reservada in indica que a cada passada do loop o objeto veículo será atualizado com o valor do próximo elemento do conjunto veículos No primeiro comando interno ao loop é verificado pelo comando if se o filtro importado corresponde a um dos elementos da tupla constituída por True e False Uma tupla é uma lista constante que após definida não pode ter nenhum elemento inserido ou removido for veículo in veículos if importado in True False and veículoimportado is not importado continue Bem agora vamos detalhar a função selecionarveículos Os parâmetros dessa função são os filtros que serão utilizados para seleção Os filtros são opcionais Caso o valor do filtro não seja passado como argumento já está previamente atribuído a None para indicar que o implementador não deseja utilizar esse filtro na seleção Neste ponto podemos observar a versatilidade da tipagem dinâmica de Python o tipo do filtro potênciamáxima poderá ser inicializado com valor None e posteriormente ser atribuído a um valor inteiro sem nenhum problema No entanto esse facilidade só será utilizada para inicialização prévia com None para padronizar filtros não obrigatórios mas você não deverá alterar os tipos dos valores atribuídos a uma mesma variável para não tornar o seu código mais difícil de ser entendido e testado Na parte inicial da função é construído um string para concatenar os valores dos filtros que forem passados como argumentos Na parte final da função é definida a variável veículosselecionados inicializada com uma lista vazia A seguir é definido o loop de seleção dos veículos cadastrados que serão testados para verificar se atendem os filtros passados como argumento O objeto veículo que atenter a todos filtros será inserido na lista veículosselecionados Ao final a função irá retornar o string com os filtros solicitados com valores diferentes de None e a lista de veículos selecionados Agora vamos entender como funciona o loop de seleção dos veículos Para cada veículo da lista de Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1015 alunos cadastrados são checados os filtros cujos valores foram passados pelo implementador Para filtros com valor do tipo str int e float os filtros são checados como obrigatórios verificando se são diferentes de None Filtros do tipo bool são checados como obrigatórios verificando se o valor passado pertence à tupla True False Caso o filtro seja obrigatório é checado se o filtro não é atendido e neste caso é utilizado o comando continue que faz com que a execução retorne ao início do loop para testar o próximo objeto veículo o teste do veículo é interrompido por que basta não atender um dos filtros para ser descartado como selecionado sem incluir o veículo testado na lista de selecionados Para testar o atendimento a um dado filtro o atributo do aluno é verificado como diferente do valor do filtro para executar o comando continue e interromper o teste do veículo caso o atributo não corresponda ao valor do filtro No caso de um filtro com valor do tipo int ou float para o qual seja definido um valor de filtro como mínimo ou máximo será feita uma comparação para verificar que o filtro não atende esse valor mínimo o atributo do objeto não pode ser inferior ao valor mínimo do filtro ou máximo ou o atributo do objeto não pode ser superior ao valor máximo do filtro A estratégia de utilizar o comando continue para testar se o filtro não é atendido simplica a legibilidade do código gerado definindo um único teste para cada filtro sem a necessidade de utilizar encadeamentos de operadores booleanos and e or que tornariam a expressão mais complexa Observe como ficaria o loop de seleção se não utilizassemos o comando continue for veículo in veículos if importado not in True False or veículoimportado importado and alimentação is None or veículoalimentação alimentação and potênciamáxima is None or veículopotência potênciamáxima veículosselecionadosappendveículo Nesta alternativa de implementação seria verificado para todos os filtros se cada filtro não é obrigatório ou se a condição do filtro é atendida Se todos os filtros forem atendidos o objeto veículo é inserido na lista de selecionados Um boa estratégia utilizada para testar o funcionamento correto da seleção de alunos é começar não utilizando nenhum filtro como obrigatório o que levará à seleção de toda a lista de alunos cadastrados e ir acrescentando um filtro obrigatório de cada vez mantendo os valores dos filtros utilizados anteriormente de forma que a lista de alunos cadastrados diminua a medida que cada filtro adicional é tornado obrigatório Vamos utilizar essa estratégia nos quatro tutoriais desta disciplina De forma semelhante no módulo agendapublicidade vamos acrescentar a função selecionaragendaspublicidade def selecionaragênciaspublicidaderankingmáximoavaliaçãoNone paísorigemNone prefixonomeNone filtros Filtros if rankingmáximoavaliação is not None filtros ranking máximo de avaliação strrankingmáximoavaliação if paísorigem is not None filtros país de origem strpaísorigem if prefixonome is not None filtros prefixo do nome prefixonome agênciaspublicidadeselecionadas for agênciapublicidade in agênciaspublicidade if rankingmáximoavaliação is not None and agênciapublicidaderankingavaliação rankingmáximoavaliação continue if paísorigem is not None and agênciapublicidadepaísorigem paísorigem continue if prefixonome is not None and not agênciapublicidadenomestartswithprefixonome continue agênciaspublicidadeselecionadasappendagênciapublicidade return filtros agênciaspublicidadeselecionadas Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1115 A função selecionaragendaspublicidade não apresenta nenhum conceito novo em relação ao que já descrevemos na função selecionarveículos 6 Definindo o Controle do Projeto No módulo divulgaçãolançamentoveículos do diretório controle definimos a funções que controlam a execução do projeto responsáveis pelo cadastro e pela filtragem dos objetos das classes Veículo e AgênciaPublicidade Observe que o nome desse módulo é baseado no nome do projeto que está sendo implementado Vamos utilizar essa convenção também para os projetos individuais dos alunos from utilgerais import imprimirobjetos from entidadesagênciapublicidade import inseriragênciapublicidade AgênciaPublicidade getagênciaspublicidade selecionaragênciaspublicidade from entidadesveículo import inserirveículo Veículo getveículos selecionarveículos def cadastraragênciaspublicidade inseriragênciapublicidadeAgênciaPublicidadenomeBETC Havas paísorigemFrança rankingavaliação1 inseriragênciapublicidadeAgênciaPublicidadeGaleria Brasil 2 inseriragênciapublicidadeAgênciaPublicidadeArtplan Brasil 3 inseriragênciapublicidadeAgênciaPublicidadeMcCann Estados Unidos 4 inseriragênciapublicidadeAgênciaPublicidadeAfrica Estados Unidos 5 def cadastrarveículos inserirveículoVeículomarcamodeloHyundai HB20 alimentaçãoflex potência80 importadoFalse inserirveículoVeículoChevrolet Onix Plus flex 116 False inserirveículoVeículoFiat Strada diesel 130 False inserirveículoVeículoFiat Toro diesel 185 False inserirveículoVeículoBYD Dolphin elétrico 95 True inserirveículoVeículoVolvo XC40 elétrico 231 True inserirveículoVeículoVolvo FH 540 diesel 540 False inserirveículoVeículoVW Delivery 11180 diesel 175 False inserirveículoVeículoDAF XF 530 diesel 530 False inserirveículoVeículoVolvo FH 460 diesel 460 False Inicialmente são definidas as importações de classes e funções implementadas em outros módulos que são utilizadas na módulo divulgaçãolançamentoveículos As importações do módulo agênciapublicidade do diretório entidades são delimitadas por parênteses porque ocupam mais de uma linha A seguir são definidas as funções cadastraragênciaspublicidade e cadastrarveículos para criar e inserir objetos das respectivas classes em seus conjuntos A função que leva o nome da própria classe ex Veículo é conhecida genericamente como construtor porque é utilizada para construir um objeto em memória Quando essa função é chamada é executado o método init da respectiva classe Observe que o objeto criado ex veículo é passado como parâmetro para um método de inserção ex inserirveículo que apenda o objeto criado no conjunto de objetos ex veículos Para concluir o código do módulo é mostrado o corpo principal do projeto no qual são chamadas as funções de cadastro definidas anteriormente no próprio módulo e as funções de filtragem ex selecionarveículos definidas nos módulos das entidades Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1215 if name main cadastraragênciaspublicidade cabeçalho Agências de Publicidades nome país de origem ranking de avaliação imprimirobjetoscabeçalho cabeçalho objetosgetagênciaspublicidade filtros agênciapublicidadesselecionadas selecionaragênciaspublicidade imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros filtros agênciapublicidadesselecionadas selecionaragênciaspublicidaderankingmáximoavaliação3 imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros filtros agênciapublicidadesselecionadas selecionaragênciaspublicidade3 paísorigemBrasil imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros filtros agênciapublicidadesselecionadas selecionaragênciaspublicidade3 Brasil prefixonomeA imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros cadastrarveículos cabeçalho Veículos marca modelo alimentação potência importado imprimirobjetos cabeçalho getveículos filtros veículosselecionados selecionarveículos imprimirobjetoscabeçalho veículosselecionados filtros filtros veículosselecionados selecionarveículosimportadoFalse imprimirobjetoscabeçalho veículosselecionados filtros filtros veículosselecionados selecionarveículosFalse alimentaçãodiesel imprimirobjetoscabeçalho veículosselecionados filtros filtros veículosselecionados selecionarveículosFalse diesel potênciamáxima200 imprimirobjetoscabeçalho veículosselecionados filtros Observe as combinações de filtragem de objetos utilizadas para as classes AgênciaPublicidade e Veículo Cada vez que um novo filtro é passado com argumento esse argumento é atribuído ao nome do parâmetro correspondente na função de filtragem Como já vimos anteriormente o nome do parâmetro é uma opção para tornar mais legível a passagem dos argumentos para uma dada função Observe que a estratégia escolhida para testar o funcionamento da filtragem de objetos facilita bastante a verificação da utilização bem sucedida da adição de cada filtro como obrigatório Inicialmente sem nenhum filtro obrigatório a lista de selecionados é equivalente à lista de cadastrados e a medida que cada filtro adicional é tornado obrigatório a lista de selecionados diminui pelo menos de um objeto Obviamente para obter esse efeito que facita o teste da filtragem você precisará escolher adequadamente os valores dos atributos dos objetos cadastrados e os valores dos filtros obrigatórios Para imprimir os conjuntos de objetos cadastrados ou selecionados nas filtragens é utilizada a função imprimirobjetos definida no módulo gerais do diretório util Nesta função é utilizada a função padronizada enumerate que além de retornar o elemento do conjunto neste caso objeto retorna também o índice desse elemento no conjunto Esse índice incrementado de 1 pois inicia em zero será mostrado na impressão dos objetos A função imprimirobjetos controla o loop de impressão do conjunto de objetos e chama a função imprimirobjeto para imprimir cada objeto com o seu respectivo índice def imprimirobjetoscabeçalho objetos filtrosNone if filtros is not None printfiltros printcabeçalho for índice objeto in enumerateobjetos imprimirobjetoíndice strobjeto def imprimirobjetoíndice objetostr formato ordem índice 1 separador stringformatado formatoformatfordem2d separador objetostr printstringformatado Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1315 Ao executar o projeto é gerada a seguinte saída inicialmente para o cadastro e as filtragens dos objetos da classe AgênciaPublicidade Finalmente são mostradas as saídas para o cadastro e as filtragens dos objetos da classe Veículo Como o valor para o filtro importado foi True aparece o valor nacional para esse filtro ao invéz de não importado Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1415 7 Encapsulamento Antes de concluir precisamos comentar um conceito importante no contexto da orientação a objetos encapsulamento Na linguagem orientada a objetos Java são utilizadas palavras reservadas como modificadores para restringir o acesso a dados e métodos de uma classe a partir de um objeto da classe Se você definir um dado em uma classe e informar com a palavra reservada private que esse dado é privado não será possível ler ou alterar esse dado diretamente a partir de um objeto da classe Da mesma forma se você definir um método como privado não será possível chamálo a partir de um objeto da classe Em Python o encapsulamento de atributos de objetos é diferente Vamos comecar ilustrando a implementação de leitura e escrita de um atributo sem o uso de encapsulamento Na definição ilustrada para a classe AgênciaPublicidade você pode alterar o atributo paísorigem diretamente A primeira agência de publicidade foi cadastrada como paísorigem França Você poderá obter a primeira agência de publicidade cadastrada na lista agênciaspublicidade e alterar o seu atributo paísorigem da seguinte forma agênciapublicidade getagênciaspublicidade0 agênciapublicidadepaísorigem Espanha printagênciapublicidadepaísorigem A saída será Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1515 Para implementar o encapsulamento em Python você deve redefinir o atributo da classe AgênciaPublicidade para paísorigempara paísorigem e utilizar decoradores property e setter para implementar métodos de leitura e escrita property def paísorigemself printatributo paísorigem lido via método de leitura return selfpaísorigem paísorigemsetter def paísorigemself paísorigem selfpaísorigem paísorigem printatributo paísorigem alterado via método de escrita A saída será Obviamente os métodos de leitura e escrita não devem ser implementados com comandos de impressão print Ilustramos dessa forma somente para você poder constatar que ao prefixar o atributo com o string e implementar seus métodos de leitura e escrita a obtenção e a alteração do atributo passarão a ser realizadas somente pela chamada implícita desses métodos Observe que as alterações para implementar o encapsulamento de atributos em Python ocorrem somente na classe que contém os atributos A implementação da leitura e escrita desses atributos no módulo divulgaçãolançamentoveículos do diretório controle não se altera Não vamos utilizar encapsulamento nos tutorias dessa disciplina no entanto é importante que você saiba como fazêlo caso deseje utilizálo Neste ponto finalizamos o Tutorial 1 com a ilustração completa da Etapa 1 do projeto de referência Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD
2
Linguagens de Programação
UFGD
4
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
7
Linguagens de Programação
UFGD
2
Linguagens de Programação
UFGD
2
Linguagens de Programação
UFGD
2
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
1
Linguagens de Programação
UFGD
Texto de pré-visualização
Linguagem de Programação I Tutorial 1 115 Classes e Objetos 1 Instalação da Linguagem de Programação e do Ambiente de Desenvolvimento Duas características principais são responsáveis pela enorme popularidade do paradigma orientado a objetos a o mapeamento de entidades do mundo real em unidades de programação que são utilizadas como novos tipos da linguagem e b e capacidade de definir unidades de programação com dados e métodos funções que acessam esses dados comuns em unidades mais genéricas e herdálos em outras unidades mais especializadas Python é uma linguagem orientada a objetos cuja utilização tem crescido muito atualmente Suas principais características são independência de plataforma gerenciamento automático da utilização de memória e transparência no endereçamento de memória Python provê uma plataforma de desenvolvimento com uma extensa API Application Program Interface que suporta diversas funcionalidades Várias outras linguagens suportam o paradigma orientado a objetos como por exemplo Java C PHP JavaScript Python Pearl Delphi C Visual Basic Dominar o paradigma orientado a objetos é muito útil no aprendizado de outras linguagens A manipulação de conjuntos de dados em Python é muito poderosa favorecendo a criação de um código compacto e versátil o que tem contribuido para grande popularidade atual desta linguagem Além disso esta linguagem está sendo largamente utilizada para o desenvolvimento de software científico como por exemplo aprendizado de máquinas machine learning e aprendizado profundo deep learning que estão potencializando aplicações muito bem sucedidas na área de inteligência artificial Para fixar os conceitos que serão apresentados neste tutorial é fundamental que cada trecho de código apresentado seja implementado e testado Desta forma será necessário instalar a versão estável mais recente do Python e a versão mais recente do IDE Integrated Development Environment Ambiente de Desenvolvimento Integrado PyCharm da Jet Brains No site httpswwwpythonorg selecione a opção Downloads baixe e instale no seu computador o arquivo executável da versão mais recente do Python para Windows por exemplo python3115 amd64 No site httpswwwjetbrainscomptbrpycharm selecione a opção Baixar e novamente esta opção para a baixar a versão gratuita Community do PyCharm baixe e instale em seu computador o arquivo executável da versão mais recente do PyCharm Community por exemplo pycharm community202321 Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 215 Para implementar e testar os trechos de código das seções 3 e 4 deste tutorial que ilustram conceitos básicos da linguagem Python crie um projeto no IDE PyCharm com o nome MPE1 selecione File New Project na janela Create Project mantenha a seleção de New environment using para criar um ambiente específico para o seu projeto em Location navegue para escolher um diretório para armazenar o seu projeto complete o diretório com o nome do projeto MPE1 em Basic Interpreter selecione a versão Python 311 mantenha a seleção de Create a mainpy welcome script finalize a criação ativando o botão Create Crie um diretório padrão para armazenar os diretórios e módulos arquivos fontes do seu projeto selecione a aba Project no canto esquerdo da tela para visualizar a janela lateral Project clique na linha com o nome do seu projeto e selecione com o botão direito do mouse New Directory preencha com o nome src abreviação para source diretório onde tradicionalmente são armazenados os arquivos fontes do projeto em geral organizados em subdiretórios de src assinale o diretório src como raiz dos arquivos fontes do projeto selecione o diretório src com o botão direito do mouse escolha a opção Mark Directory as Mark as Source Root selecione o arquivo mainpy e movao para o diretório src Ajuste o arquivo mainpy na janela de projeto lateral esquerda clique no arquivo mainpy para visualizar o seu código na janela à direita da janela de projeto remova a seleção de ponto de parada para teste passo a passo debug clicando no círculo vermelho no lado esquerdo de uma das linhas do código remova todos os comentários strings iniciados com o caracter altere o código do arquivo mainpy para ficar da seguinte forma def imprimirlinguagemprogramação printfVamos aprender a programar na linguagem linguagemprogramação if name main imprimirPython Execute o programa clicando na seta verde no canto superior direito da sua janela Você visualizará o resultado do processo na janela Run execução Vamos aprender a programar na linguagem Python Process finished with exit code 0 Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 315 O código em Python é organizado em blocos de comandos Diferentemente de outras linguagens como Java C e C bloco em Python não são delimitados por e sim por identação utilizando Tab Portanto você deve estar muito atento para que a identação de seu código esteja correta Na execução o Python atribui à variável prédefinida name o string main e executa o corpo principal do programa que neste caso tem somente o comando condicional if Variáveis prédefinidas são cercadas por duplo underline como é o caso da variável name O comando condicional if testa com sucesso que a variável name é igual ao contém o mesmo valor que string main Pelo fato do teste do comando if ser bem sucedido o seu corpo interno de comandos é executado neste exemplo somente a chamada da função imprimir passando como argumento o string Python A função imprimir recebe o parâmetro entre parênteses linguagemprogramação para o qual foi atribuído como argumento o string Python Ao ser chamada a função executa o seu corpo interno de comandos que neste exemplo é composto somente pela chamada da função prédefinida builtin print utilizada para imprimir strings Funções prédefinidas são disponíveis em Python sem que seja necessário definilas O argumento passado para a função print é um string formatado f para compor trechos fixos Vamos aprender a programar na linguagem e com trechos variáveis entre chaves O trecho variável recebe o valor passado como argumento Python para o parâmetro linguagemprogramação Como resultado é impresso na tela do seu computador o string Vamos aprender a programar na linguagem Python O resultado da execução é mostrado na janela de execução Run Adicionalmente como mensagem de final de execução é impressa a mensagem Process finished with exit code 0 cuja tradução é Processo concluído com código de saída 0 O código 0 indica que a execução foi concluída com sucesso Caso seja reportado o código 1 a mensagem indica execução mal sucedida Esta mensagem se repete em todas as execuções e será omitida nas ilustrações da seção 2 Este exemplo muito simples com uma breve explicação é o seu primeiro contato com a execução de um programa em Python Na próxima seção vamos conceituar a primeira etapa de um projeto de referência 2 Implementação de Entidades Sem Relacionamentos Nos tutoriais dessa disciplina é adotado o modelo de aprendizado a partir de um projeto de referência cujo código se inicia neste tutorial e cresce incrementalmente até atingir o projeto completo no Tutorial 4 Desta forma a especificação do projeto definida no Tutorial Auxiliar A Especificação de um Projeto Orientado a Objetos de Referência será implementada ao longo dos quatro tutoriais da disciplina Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 415 Neste ponto é importante observar uma diferença fundamental entre Python e outras linguagens de programação como C C e Java Python é uma linguagem com tipagem dinâmica o que significa que você não especifica o tipo de dado sendo definido Esse tipo será inferido durante a execução do código Vamos considerar por exemplo que os valores atribuídos a uma variável podem ser dos seguintes tipos str string ex disciplina Metologia de Programação int inteiro positivo ou negativo ex cargahorária 72 float ponto flutuante positivo ou negativo ex notamínimaaprovação 60 bool boolean com valores True ou False ex disciplinaobrigatória True Cada entidade do mundo real é mapeada em uma classe de objetos denominada simplesmente como classe em uma linguagem de programação orientada a objetos Uma classe é composta de dados que mapeiam atributos do mundo real Uma classe é um tipo complexo composto de vários dados que estende os tipos comuns da linguagem de programação inteiro int flutuante float booleno bool string str acrescentando tipos mapeados a partir das entidades do mundo real relevantes para um dado projeto de software Assim como podemos criar uma variável inteira flutuante números com casas decimais booleana ou string podemos criar variáveis a partir de uma classe Essas variáveis são denominadas objetos e em geral são inicializadas com valores para os atributos da classe Vamos adotar a seguinte metodologia para você entender cada trecho de código que será apresentado a primeiro ilustramos o trecho de código e b em seguida vamos explicar cada novo conceito que ele apresenta Mesmo que você já conheça alguns desses conceitos não pule nada Leia tudo com atenção e releia se for necessário até ficar claro para você Alguns conceitos serão comentados mais de uma vez mas isso é bom para fixar bem o entendimento a respeito No Tutorial Auxiliar Especificação de um Projeto Orientado a Objetos de Referência foi especificado o projeto Divulgação de Lançamentos de Veículos que servirá de referência para a especificação dos projetos individuais dos alunos e terá seu código desenvolvido incrementalmente nos 4 tutoriais dessa disciplina A leitura do Tutorial Auxiliar é um prérequisito para a leitura do Tutorial 1 Os relacionamentos entre das entidades do projeto Divulgação de Lançamentos de Veículos são os seguintes Entidades sem relacionamentos Veículo AgênciaPublicidade Agregação Montadora Veículo Associação Lançamento Montadora Veículo AgênciaPublicidade Herança Veículo Carro Caminhão Delegação Lançamento Data Neste tutorial vamos ilustrar a implementação das entidades sem relacionamentos Veículo e AgênciaPublicidade Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 515 No módulo veículo do diretório entidades vamos definir a classe Veículo Observe que a classe Veículo mapeia em uma unidade computacional classe uma entidade que você encontra no mundo real e que seus atributos marcamodelo alimentação potência importado também mapeiam características de um veículo que você encontra no mundo real class Veículo def initself marcamodelo alimentação potência importado selfmarcamodelo marcamodelo selfalimentação alimentação if alimentação in flex diesel elétrico else indefinida selfpotência potência selfimportado importado A palavra reservada class classe é utilizada para definir uma classe cujo nome deverá utilizar a primeira letra maíscula ex Carro ou um nome composto de palavras com a primeira letra maiúscula ex OficinaMecânica Nomes de diretórios módulos funções e variáveis utilizam somente letras minúsculas ex nome também separando palavras por underline ex datanascimento A palavra reservada def abreviação para define function é utilizada para definir o método init Funções podem ser utilizadas para obter armazenar ou computar dados a partir de outros dados Funções internas a uma classe são chamadas de métodos no jargão orientado a objetos Métodos padronizados em Python tem seu nome cercado por dois underlines como por exemplo o método init Os atributos da classe são inicializados neste método que é chamado quando o objeto é construído Por esse motivo os métodos init utilizados para construir objetos nas classes são chamados de construtores Esse método tem em geral um parâmetro para cada atributo do objeto que será inicializado na sua construção Todos os métodos de uma classe tem como primeiro parâmetro a palavra reservada self próprio para indicar que todo método da classe tem acesso a todos os dados da classe que são prefixados por self ex selfmarcamodelo Os demais parâmetros do método init são utilizados para inicializar os atributos da classe ex selfmarcamodelo marcamodelo O caracter é utilizado para atribuir valores ou expressões a uma variável O atributo selfalimentação é considerado um enumerado ou seja uma variável que pode assumir um valor definido em uma lista de valores Neste caso é importante verificar utilizando um comando if se associado ao comando de atribuição se o valor passado como parâmetro pertence à lista de valores possíveis correspondendo aos tipos de alimentação utilizadas em um veículo selfalimentação alimentação if alimentação in flex diesel elétrico else indefinida O comando if é um teste condicional utilizado para testar um condição Por exemplo se queremos testar se um string não é nulo None antes de imprimilo É necessário utilizar o separador após a condição do if se e após o else senão Se a condição for verdadeira o bloco de comandos que segue logo após o separador localizado após condição será executado Caso contrário será executado o bloco de comando que segue logo após o else Ao comparar com None não utilizamos ou utilizados para comparar com variáveis ou valores do tipo int float bool ou str e sim is ou is not if marcamodelo is not None printmarcamodelo else print marca modelo com valor nulo Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 615 No exemplo anterior o bloco de comandos associado à condição verdadeira do if ou à condição falsa else tem um único comando Neste caso particular utilizaremos neste tutorial os comandos na mesma linha do if e do else mas você pode optar pela formatação que deseja utilizar if marcamodelo is not None printmarcamodelo else print marca modelo com valor nulo É muito útil que um objeto seja identificado unicamente pelo valor do seu atributo chave Para classes representando pessoas ex Cliente Funcionário Aluno Médico o atributo chave mais utilizado é o CPF uma vez que identifica uma pessoa unicamente em todo o território nacional No entanto dependendo da aplicação podemos utilizar o nome da pessoa desde que não exista outra pessoa com o mesmo nome no projeto No caso do projeto Divulgação de Lançamentos de Veículos o lançamento de um veículo com uma determinada marca modelo será divulgado uma única vez quando for lançado pela primeira vez no mercado brasileiro Desta forma a marca modelo do veículo lançado servirá como chave para diferenciálo de todos os outros lançamentos Estamos assumindo que a montadora do veículo que será lançado contratará uma agência de publicidade para divulgar o seu lançamento No módulo agênciapublicidade do diretório entidades vamos definir a entidade AgênciaPublicidade do mundo real em sua unidade computacional a classe AgênciaPublicidade class AgênciaPublicidade def initself nome paísorigem rankingavaliação selfnome nome selfpaísorigem paísorigem selfrankingavaliação rankingavaliação 3 Método para gerar um String representando os Atributos do Objeto Após cadastrar vários objetos de uma dada classe é muito comum desejarmos imprimir os dados de cada objeto cadastrado Para o obter o string que representa os atributos do objeto criado utilizamos o método padronizado str A seguir vamos o acrescentar o método str na classe Veículo e na classe AgênciaPublicidade omitindo somente para economizar espaço no Tutorial o método init que é sempre o primeiro método a ser implementado na classe class Veículo def strself if selfimportado importadostr importado else importadostr formato 19 8 6 veículoformatado formatoformat selfmarcamodelo selfalimentação fselfpotência3d cv importadostr return veículoformatado Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 715 O método str não tem parâmetros dado que sua função é gerar um string a partir dos atributos da classe Em geral os valores dos atributos da classe que serão impressos serão representados por strings de tamanhos diferentes ex marca modelo de veículos Para tornar a impressão mais amigável é interessante alinhar cada coluna de valores a ser impressa No caso de veículos as colunas são marcamodelo alimentação potência e importado Python suporta a definição do formato que será utilizado para imprimir cada objeto Esse formato é definido por um string contendo para cada coluna a ser impressa calculado como o tamanho do maior valor a ser impresso em cada coluna acrescido de alguns espaços para separar as colunas No primeiro comando do método str vemos a sintaxe utilizada para definir o formato de impressão assinalando o espaço de cada uma das quatro colunas a serem impressas para cada objeto da classe Veículo O caracter é utilizado para indicar indentação à esquerda ou seja todos os valores de uma dada coluna serão alinhados no inicio de cada string da coluna Se a escolha tivesse sido indentação à direita seria utilizado o caracter e neste caso todos os valores de uma dada coluna seriam alinhadas ao final de cada string da coluna Após a definição do string do formato o método format suportado pelo Python é aplicado ao formato recebendo como parâmetros os strings de cada coluna a ser impressa Desta forma os atributos que não são strings ex idade e peso foram convertidos para string pela utilização da função str prédefinida pelo Python Os valores da coluna potência dos veículos que serão cadastrados poderão ocupar 2 ou 3 dígitos Para alinhar esses valores à esquerda é possível utilizar o formatador f informando quantos caracteres deverão ser impressos neste caso 3 caracteres 3d Para separar as colunas da impressão dos objetos é utilizado o caracter Para esse caracter não é necessário definir a quantidade de caracteres utilizando somente Quando uma classe tiver um atributo do tipo bool o mais recomendado é formatar o seu valor na última coluna e mostrálo somente quando seu valor for True Observe que no método str foi testado se o valor do atributo importado é True e neste caso é incluída uma coluna com a palavra importado Caso contrário o valor é omitido o que mais amigável do que mostrar não importado para a maioria dos veículos que não são importados Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 815 A seguir vamos ilustrar o método str da classe AgênciaPublicidade class AgênciaPublicidade def strself formato 10 14 1 agênciapublicidadeformatada formatoformat selfnome selfpaísorigem strselfrankingavaliação return agênciapublicidadeformatada 4 Conjuntos para Armazenar Objetos da Classe A forma mais simples de armazenar objetos variáveis criadas a partir de uma classe novo tipo da aplicação que mapeia uma entidade do mundo real é definir uma variável global pode ser utilizada por toda a aplicação utilizando o nome da classe no plural ex veículos agênciaspublicidade dado que irá armazenar um conjunto de objetos Python suporta uma estrutura de dados denominada lista Os itens ex objetos da classe Veículo armazenados na lista exveículos podem ser consultados por índices na ordem em que foram armazenados ex veículosn onde varia de 0 até o número de itens da lista menos 1 No módulo veículo definimos antes da definição da classe Veículo o conjunto de objetos veículos e suas funções associadas veículos def getveículos return veículos def inserirveículoveículo veículosappendveículo O conjunto veículos é inicializado com uma lista vazia A função getveículos retorna o conjunto de veículos A função inserirveículo recebe um objeto veículo e apenda na lista veículos Pelo fato de cada função ter um único comando optamos por definilo na mesma linha da definição da função No entanto se você preferir pode indentálo na próxima linha da função def getveículos return veículos A seguir implementamos no módulo agênciapublicidade antes da classe AgênciaPublicidade o conjunto de objetos agênciaspublicidade e suas funções associadas agênciaspublicidade def getagênciaspublicidade return agênciaspublicidade def inseriragênciapublicidadeagênciapublicidade agênciaspublicidadeappendagênciapublicidade 5 Utilizando Filtros para Selecionar um Subconjunto de Objetos Para que um projeto seja útil para os usuários ele deve suportar a filtragem dos objetos cadastrados No módulo veículo vamos acrescentar a função selecionarveículos def selecionarveículosimportadoNone alimentaçãoNone potênciamáximaNone filtros Filtros if importado filtros importado elif importado False filtros nacional Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 915 if alimentação is not None filtros alimentação alimentação if potênciamáxima is not None filtros potência máxima strpotênciamáxima veículosselecionados for veículo in veículos if importado in True False and veículoimportado importado continue if alimentação is not None and veículoalimentação alimentação continue if potênciamáxima is not None and veículopotência potênciamáxima continue veículosselecionadosappendveículo return filtros veículosselecionad Antes de detalhar a função de filtragem vamos comentar o uso dos comandos if e for que são utilizados nessa função Vimos anteriormente que o teste condicional if pode ser utilizado com a palavra reservada else para indicar o bloco de ações que será realizado se a condição que está sendo testada pelo if não for satisfeita No entanto na função de filtragem caso a condição do if não seja aceita será necessário testar uma outra condição dado que o valor do parâmetro importado poderá ser None True ou False Neste caso é utilizada a palavra reservada elif que é uma contração para as palavras else if senão se associada a uma segunda condição Na situação mais geral um comando condicional pode testar várias condições utilizando um if para testar a primeira condição vários elif para testar as demais condições e um else se nenhuma das condições for aceita O comando for é utilizado para testar uma condição que resultará na repetição da execução de um bloco de comandos enquanto a condição testada permanecer verdadeira O comando for utilizado conjuntamente com a palavra reservada in indica que a cada passada do loop o objeto veículo será atualizado com o valor do próximo elemento do conjunto veículos No primeiro comando interno ao loop é verificado pelo comando if se o filtro importado corresponde a um dos elementos da tupla constituída por True e False Uma tupla é uma lista constante que após definida não pode ter nenhum elemento inserido ou removido for veículo in veículos if importado in True False and veículoimportado is not importado continue Bem agora vamos detalhar a função selecionarveículos Os parâmetros dessa função são os filtros que serão utilizados para seleção Os filtros são opcionais Caso o valor do filtro não seja passado como argumento já está previamente atribuído a None para indicar que o implementador não deseja utilizar esse filtro na seleção Neste ponto podemos observar a versatilidade da tipagem dinâmica de Python o tipo do filtro potênciamáxima poderá ser inicializado com valor None e posteriormente ser atribuído a um valor inteiro sem nenhum problema No entanto esse facilidade só será utilizada para inicialização prévia com None para padronizar filtros não obrigatórios mas você não deverá alterar os tipos dos valores atribuídos a uma mesma variável para não tornar o seu código mais difícil de ser entendido e testado Na parte inicial da função é construído um string para concatenar os valores dos filtros que forem passados como argumentos Na parte final da função é definida a variável veículosselecionados inicializada com uma lista vazia A seguir é definido o loop de seleção dos veículos cadastrados que serão testados para verificar se atendem os filtros passados como argumento O objeto veículo que atenter a todos filtros será inserido na lista veículosselecionados Ao final a função irá retornar o string com os filtros solicitados com valores diferentes de None e a lista de veículos selecionados Agora vamos entender como funciona o loop de seleção dos veículos Para cada veículo da lista de Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1015 alunos cadastrados são checados os filtros cujos valores foram passados pelo implementador Para filtros com valor do tipo str int e float os filtros são checados como obrigatórios verificando se são diferentes de None Filtros do tipo bool são checados como obrigatórios verificando se o valor passado pertence à tupla True False Caso o filtro seja obrigatório é checado se o filtro não é atendido e neste caso é utilizado o comando continue que faz com que a execução retorne ao início do loop para testar o próximo objeto veículo o teste do veículo é interrompido por que basta não atender um dos filtros para ser descartado como selecionado sem incluir o veículo testado na lista de selecionados Para testar o atendimento a um dado filtro o atributo do aluno é verificado como diferente do valor do filtro para executar o comando continue e interromper o teste do veículo caso o atributo não corresponda ao valor do filtro No caso de um filtro com valor do tipo int ou float para o qual seja definido um valor de filtro como mínimo ou máximo será feita uma comparação para verificar que o filtro não atende esse valor mínimo o atributo do objeto não pode ser inferior ao valor mínimo do filtro ou máximo ou o atributo do objeto não pode ser superior ao valor máximo do filtro A estratégia de utilizar o comando continue para testar se o filtro não é atendido simplica a legibilidade do código gerado definindo um único teste para cada filtro sem a necessidade de utilizar encadeamentos de operadores booleanos and e or que tornariam a expressão mais complexa Observe como ficaria o loop de seleção se não utilizassemos o comando continue for veículo in veículos if importado not in True False or veículoimportado importado and alimentação is None or veículoalimentação alimentação and potênciamáxima is None or veículopotência potênciamáxima veículosselecionadosappendveículo Nesta alternativa de implementação seria verificado para todos os filtros se cada filtro não é obrigatório ou se a condição do filtro é atendida Se todos os filtros forem atendidos o objeto veículo é inserido na lista de selecionados Um boa estratégia utilizada para testar o funcionamento correto da seleção de alunos é começar não utilizando nenhum filtro como obrigatório o que levará à seleção de toda a lista de alunos cadastrados e ir acrescentando um filtro obrigatório de cada vez mantendo os valores dos filtros utilizados anteriormente de forma que a lista de alunos cadastrados diminua a medida que cada filtro adicional é tornado obrigatório Vamos utilizar essa estratégia nos quatro tutoriais desta disciplina De forma semelhante no módulo agendapublicidade vamos acrescentar a função selecionaragendaspublicidade def selecionaragênciaspublicidaderankingmáximoavaliaçãoNone paísorigemNone prefixonomeNone filtros Filtros if rankingmáximoavaliação is not None filtros ranking máximo de avaliação strrankingmáximoavaliação if paísorigem is not None filtros país de origem strpaísorigem if prefixonome is not None filtros prefixo do nome prefixonome agênciaspublicidadeselecionadas for agênciapublicidade in agênciaspublicidade if rankingmáximoavaliação is not None and agênciapublicidaderankingavaliação rankingmáximoavaliação continue if paísorigem is not None and agênciapublicidadepaísorigem paísorigem continue if prefixonome is not None and not agênciapublicidadenomestartswithprefixonome continue agênciaspublicidadeselecionadasappendagênciapublicidade return filtros agênciaspublicidadeselecionadas Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1115 A função selecionaragendaspublicidade não apresenta nenhum conceito novo em relação ao que já descrevemos na função selecionarveículos 6 Definindo o Controle do Projeto No módulo divulgaçãolançamentoveículos do diretório controle definimos a funções que controlam a execução do projeto responsáveis pelo cadastro e pela filtragem dos objetos das classes Veículo e AgênciaPublicidade Observe que o nome desse módulo é baseado no nome do projeto que está sendo implementado Vamos utilizar essa convenção também para os projetos individuais dos alunos from utilgerais import imprimirobjetos from entidadesagênciapublicidade import inseriragênciapublicidade AgênciaPublicidade getagênciaspublicidade selecionaragênciaspublicidade from entidadesveículo import inserirveículo Veículo getveículos selecionarveículos def cadastraragênciaspublicidade inseriragênciapublicidadeAgênciaPublicidadenomeBETC Havas paísorigemFrança rankingavaliação1 inseriragênciapublicidadeAgênciaPublicidadeGaleria Brasil 2 inseriragênciapublicidadeAgênciaPublicidadeArtplan Brasil 3 inseriragênciapublicidadeAgênciaPublicidadeMcCann Estados Unidos 4 inseriragênciapublicidadeAgênciaPublicidadeAfrica Estados Unidos 5 def cadastrarveículos inserirveículoVeículomarcamodeloHyundai HB20 alimentaçãoflex potência80 importadoFalse inserirveículoVeículoChevrolet Onix Plus flex 116 False inserirveículoVeículoFiat Strada diesel 130 False inserirveículoVeículoFiat Toro diesel 185 False inserirveículoVeículoBYD Dolphin elétrico 95 True inserirveículoVeículoVolvo XC40 elétrico 231 True inserirveículoVeículoVolvo FH 540 diesel 540 False inserirveículoVeículoVW Delivery 11180 diesel 175 False inserirveículoVeículoDAF XF 530 diesel 530 False inserirveículoVeículoVolvo FH 460 diesel 460 False Inicialmente são definidas as importações de classes e funções implementadas em outros módulos que são utilizadas na módulo divulgaçãolançamentoveículos As importações do módulo agênciapublicidade do diretório entidades são delimitadas por parênteses porque ocupam mais de uma linha A seguir são definidas as funções cadastraragênciaspublicidade e cadastrarveículos para criar e inserir objetos das respectivas classes em seus conjuntos A função que leva o nome da própria classe ex Veículo é conhecida genericamente como construtor porque é utilizada para construir um objeto em memória Quando essa função é chamada é executado o método init da respectiva classe Observe que o objeto criado ex veículo é passado como parâmetro para um método de inserção ex inserirveículo que apenda o objeto criado no conjunto de objetos ex veículos Para concluir o código do módulo é mostrado o corpo principal do projeto no qual são chamadas as funções de cadastro definidas anteriormente no próprio módulo e as funções de filtragem ex selecionarveículos definidas nos módulos das entidades Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1215 if name main cadastraragênciaspublicidade cabeçalho Agências de Publicidades nome país de origem ranking de avaliação imprimirobjetoscabeçalho cabeçalho objetosgetagênciaspublicidade filtros agênciapublicidadesselecionadas selecionaragênciaspublicidade imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros filtros agênciapublicidadesselecionadas selecionaragênciaspublicidaderankingmáximoavaliação3 imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros filtros agênciapublicidadesselecionadas selecionaragênciaspublicidade3 paísorigemBrasil imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros filtros agênciapublicidadesselecionadas selecionaragênciaspublicidade3 Brasil prefixonomeA imprimirobjetoscabeçalho agênciapublicidadesselecionadas filtros cadastrarveículos cabeçalho Veículos marca modelo alimentação potência importado imprimirobjetos cabeçalho getveículos filtros veículosselecionados selecionarveículos imprimirobjetoscabeçalho veículosselecionados filtros filtros veículosselecionados selecionarveículosimportadoFalse imprimirobjetoscabeçalho veículosselecionados filtros filtros veículosselecionados selecionarveículosFalse alimentaçãodiesel imprimirobjetoscabeçalho veículosselecionados filtros filtros veículosselecionados selecionarveículosFalse diesel potênciamáxima200 imprimirobjetoscabeçalho veículosselecionados filtros Observe as combinações de filtragem de objetos utilizadas para as classes AgênciaPublicidade e Veículo Cada vez que um novo filtro é passado com argumento esse argumento é atribuído ao nome do parâmetro correspondente na função de filtragem Como já vimos anteriormente o nome do parâmetro é uma opção para tornar mais legível a passagem dos argumentos para uma dada função Observe que a estratégia escolhida para testar o funcionamento da filtragem de objetos facilita bastante a verificação da utilização bem sucedida da adição de cada filtro como obrigatório Inicialmente sem nenhum filtro obrigatório a lista de selecionados é equivalente à lista de cadastrados e a medida que cada filtro adicional é tornado obrigatório a lista de selecionados diminui pelo menos de um objeto Obviamente para obter esse efeito que facita o teste da filtragem você precisará escolher adequadamente os valores dos atributos dos objetos cadastrados e os valores dos filtros obrigatórios Para imprimir os conjuntos de objetos cadastrados ou selecionados nas filtragens é utilizada a função imprimirobjetos definida no módulo gerais do diretório util Nesta função é utilizada a função padronizada enumerate que além de retornar o elemento do conjunto neste caso objeto retorna também o índice desse elemento no conjunto Esse índice incrementado de 1 pois inicia em zero será mostrado na impressão dos objetos A função imprimirobjetos controla o loop de impressão do conjunto de objetos e chama a função imprimirobjeto para imprimir cada objeto com o seu respectivo índice def imprimirobjetoscabeçalho objetos filtrosNone if filtros is not None printfiltros printcabeçalho for índice objeto in enumerateobjetos imprimirobjetoíndice strobjeto def imprimirobjetoíndice objetostr formato ordem índice 1 separador stringformatado formatoformatfordem2d separador objetostr printstringformatado Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1315 Ao executar o projeto é gerada a seguinte saída inicialmente para o cadastro e as filtragens dos objetos da classe AgênciaPublicidade Finalmente são mostradas as saídas para o cadastro e as filtragens dos objetos da classe Veículo Como o valor para o filtro importado foi True aparece o valor nacional para esse filtro ao invéz de não importado Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1415 7 Encapsulamento Antes de concluir precisamos comentar um conceito importante no contexto da orientação a objetos encapsulamento Na linguagem orientada a objetos Java são utilizadas palavras reservadas como modificadores para restringir o acesso a dados e métodos de uma classe a partir de um objeto da classe Se você definir um dado em uma classe e informar com a palavra reservada private que esse dado é privado não será possível ler ou alterar esse dado diretamente a partir de um objeto da classe Da mesma forma se você definir um método como privado não será possível chamálo a partir de um objeto da classe Em Python o encapsulamento de atributos de objetos é diferente Vamos comecar ilustrando a implementação de leitura e escrita de um atributo sem o uso de encapsulamento Na definição ilustrada para a classe AgênciaPublicidade você pode alterar o atributo paísorigem diretamente A primeira agência de publicidade foi cadastrada como paísorigem França Você poderá obter a primeira agência de publicidade cadastrada na lista agênciaspublicidade e alterar o seu atributo paísorigem da seguinte forma agênciapublicidade getagênciaspublicidade0 agênciapublicidadepaísorigem Espanha printagênciapublicidadepaísorigem A saída será Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD Linguagem de Programação I Tutorial 1 1515 Para implementar o encapsulamento em Python você deve redefinir o atributo da classe AgênciaPublicidade para paísorigempara paísorigem e utilizar decoradores property e setter para implementar métodos de leitura e escrita property def paísorigemself printatributo paísorigem lido via método de leitura return selfpaísorigem paísorigemsetter def paísorigemself paísorigem selfpaísorigem paísorigem printatributo paísorigem alterado via método de escrita A saída será Obviamente os métodos de leitura e escrita não devem ser implementados com comandos de impressão print Ilustramos dessa forma somente para você poder constatar que ao prefixar o atributo com o string e implementar seus métodos de leitura e escrita a obtenção e a alteração do atributo passarão a ser realizadas somente pela chamada implícita desses métodos Observe que as alterações para implementar o encapsulamento de atributos em Python ocorrem somente na classe que contém os atributos A implementação da leitura e escrita desses atributos no módulo divulgaçãolançamentoveículos do diretório controle não se altera Não vamos utilizar encapsulamento nos tutorias dessa disciplina no entanto é importante que você saiba como fazêlo caso deseje utilizálo Neste ponto finalizamos o Tutorial 1 com a ilustração completa da Etapa 1 do projeto de referência Prof Joinvile Batista Junior Sistemas de Informação FACETUFGD