S06 - Atividade de Aprendizagem: Objetos
Um paradigma é uma maneira de pensar ou uma maneira de perceber o mundo. Existem pelo menos quatro paradigmas principais para programar um computador: procedural, declarativo, funcional e orientado a objetos. Durante a maior parte do CSE 110 e 111, você usou programação procedural. Nesta semana, você conhecerá a programação orientada a objetos.
Paradigmas de Programação
Programação Procedural
Programação procedural é uma forma de programação focada em etapas para executar uma tarefa. Por exemplo, para calcular a média de 100 números, somamos todos e dividimos por 100. O exemplo 1 mostra um programa em Python que faz esse cálculo.
# Exemplo 1
def main():
numeros = [87, 95, 72, 92, 95, 88, 84]
total = 0
for x in numeros:
total += x
media = total/len(numeros)
print(f"média: {media:.2f}")
# Chama main para iniciar este programa.
if __name__ == "__main__":
main()
> python exemplo1.py média: 87.57
Observe que, com a programação procedural, devemos escrever o processo ou as etapas necessárias para concluir uma tarefa. Programação procedural é o tipo de programação que você usou com mais frequência no CSE 110 e 111.
Programação Declarativa
Na programação declarativa, não nos preocupamos com as etapas do processo, mas sim com o resultado desejado. No exemplo da média, em vez de detalhar como somar e dividir, apenas indicamos os números e pedimos ao computador que calcule a média. Um exemplo disso é SQL, uma linguagem declarativa usada em bancos de dados relacionais. O exemplo 2 mostra um código SQL que calcula a média de uma coluna de números.
-- Exemplo 2
SELECT AVG(numeros) FROM tabela;
AVG(numeros) ----------------- 87.57142857142857
No exemplo 2, o código SQL não mostra as etapas do cálculo da média, como acontece na programação procedural, pois elas já foram implementadas anteriormente. Em vez disso, usamos um comando que instrui o computador a calcular a média da coluna numeros.
Programação declarativa significa isso: declaramos o que queremos que o computador faça, sem especificar como. O computador determina os passos necessários e executa a tarefa.
Programação Funcional
Quando usamos programação funcional para programar um computador, nos concentramos nas funções necessárias para realizar uma tarefa. Os matemáticos geralmente acham a programação funcional natural para eles porque estão acostumados a usar funções enquanto estudam matemática. Na programação funcional, as funções são tão importantes que frequentemente passamos funções para outras funções.
# Exemplo 3
from functools import reduce
def main():
numeros = [87, 95, 72, 92, 95, 88, 84]
func_add = lambda a, b: a + b
total = reduce(func_add, numeros)
media = total / len(numeros)
print(f"média: {media:.2f}")
# Chama main para iniciar este programa.
if __name__ == "__main__":
main()
> python exemplo_3.py média: 87.57
Observe como o exemplo 3 usa três funções: uma função lambda, a função reduce e a função len. Observe também que a função lambda é passada para a função reduce. Passar uma função para outra função é uma das marcas da programação funcional.
Programação Orientada a Objetos
A programação orientada a objetos (POO) é um paradigma que reúne dados (atributos) e funções (métodos) em objetos.
Exemplo: em um sistema de matrícula, um objeto Estudante teria nome e telefone, com métodos como matricular ou abandonar. Já um objeto Curso teria codigo_do_curso e lista_estudantes, com métodos como obter_estudantes.
Em Python, muitas estruturas já são objetos, como listas, dicionários e os leitores do módulo csv.
Uma das marcas da POO é o uso do operador ponto (dot operator) (.) para acessar atributos e chamar métodos, como em lista.append().
# Exemplo 4
def main():
numeros = [87, 95, 72, 92, 95, 88, 84]
numeros.append(78)
numeros.append(72)
print(numeros)
# Chama main para iniciar este programa.
if __name__ == "__main__":
main()
> python exemplo_4.py [87, 95, 72, 92, 95, 88, 84, 78, 72]
Existem vários tipos de comandos que são comumente encontrados em programas orientados a objetos. Esses tipos de comandos são tão comuns que um programador deve reconhecê-los e escrevê-los. Três desses tipos de comandos são:
-
Criar objetos, por exemplo:
obj = datetime.now() -
Acessar os atributos de um objeto usando o operador ponto (.), por exemplo:
ano = obj.year -
Chamar os métodos de um objeto usando o operador ponto (.), por exemplo:
novo_obj = obj.replace(year=2035) dia_da_semana = obj.weekday()
Listas Python são Objetos
Em Python, as listas são objetos com atributos e métodos, e um programador pode modificar uma lista chamando esses métodos. Os métodos de lista estão documentados em uma seção do Tutorial Python intitulada Mais sobre listas.
O exemplo 5 abaixo contém um programa semelhante ao exemplo 2 no conteúdo de preparação 1 da Semana 4. Agora que você sabe o que é um objeto, que objetos têm métodos e que listas de Python são objetos, este código de exemplo deve fazer mais sentido do que fez na semana 4. Observe que o método append é chamado nas linhas 6–8, insert é chamado na linha 10, index é chamado na linha 13, pop é chamado na linha 18 e remove é chamado na linha 20.
# Exemplo 5
def main():
# Cria uma lista vazia que conterá nomes de tecidos.
tecidos = []
# Adiciona três elementos no final da lista de tecidos.
tecidos.append("veludo")
tecidos.append("denim")
tecidos.append("algodão fino")
# Insere um elemento no início da lista de tecidos.
tecidos.insert(0, "chiffon")
print(tecidos)
# Obtém o índice em que veludo está armazenado na lista de tecidos.
i = tecidos.index("veludo")
# Substitui veludo por tafetá.
tecidos[i] = "tafetá"
print(tecidos)
# Remove o último elemento da lista de tecidos.
tecidos.pop()
# Remove denim da lista de tecidos.
tecidos.remove("denim")
print(tecidos)
# Chama main para iniciar este programa.
if __name__ == "__main__":
main()
> python exemplo_5.py ['chiffon', 'veludo', 'denim', 'algodão fino'] ['chiffon', 'tafetá', 'denim', 'algodão fino'] ['chiffon', 'tafetá']
Dicionários Python são Objetos
Dicionários Python são objetos com atributos e métodos, e um programador pode modificar um dicionário chamando esses métodos. Não parece haver uma página oficial de Python que documente os métodos do dicionário, então aqui está uma lista dos métodos integrados de dicionário:
| Método | Descrição |
|---|---|
| d.clear() | Remove todos os elementos do dicionário d. |
| d.copy() | Retorna uma cópia do dicionário d. |
| d.get(chave) |
Retorna o valor da chave especificada. Chamar o método get é quase equivalente a usar colchetes ([ e ]) para encontrar uma chave em um dicionário.
|
| d.items() | Retorna uma lista que contém os pares chave-valor que estão no dicionário d. |
| d.keys() | Retorna uma lista que contém as chaves que estão no dicionário d. |
| d.pop(chave) | Remove o elemento com a chave especificada do dicionário d. |
| d.update(outro) | Atualiza o dicionário d com os pares chave-valor que estão no dicionário outro. |
| d.values() | Retorna uma lista que contém os valores que estão no dicionário d. |
O código de exemplo a seguir, que é parecido com o exemplo 1 do conteúdo de preparação 2 da semana 4, chama métodos de dicionário nas linhas 17, 23 e 31.
# Exemplo 6
def main():
# Cria um dicionário com identificações de estudantes como
# as chaves e os nomes dos estudantes como valores.
estudantes = {
"42-039-4736": "Carlos Silva",
"61-315-0160": "Maria Oliveira",
"10-450-1203": "Ana Soares",
"75-421-2310": "João Pereira",
"07-103-5621": "Maria Oliveira",
"81-298-9238": "Samanta Paz"
}
# Obtém uma identificação de estudante do usuário.
id = input("Digite uma identificação de estudante: ")
# Encontra a identificação do estudante no dicionário e
# recupera o nome do estudante correspondente.
nome = estudantes.get(id)
if nome:
# Exibe o nome do estudante.
print(nome)
# Remove do dicionário o estudante que o usuário
# especificou.
estudantes.pop(id)
else:
print("Estudante inexistente")
print()
# Usa um loop for para exibir cada par chave-valor
# no dicionário. O código no
# corpo de um loop pode fazer muito mais com
# cada par chave-valor e depois simplesmente exibi-lo.
for chave, valor in estudantes.items():
print(chave, valor)
# Chama main para iniciar este programa.
if __name__ == "__main__":
main()
> python exemplo_6.py
Digite uma identificação de estudante: 81-298-9238
Samanta Paz
42-039-4736 Carlos Silva,
61-315-0160 Maria Oliveira,
10-450-1203 Ana Soares,
75-421-2310 João Pereira,
07-103-5621 Maria Oliveira,
81-298-9238 Samanta Paz
Resumo
Esta aula apresenta a programação orientada a objetos. Você está aprendendo que um objeto tem dados (atributos) e funções (métodos) e que um programador usa o operador ponto (.) para acessar os atributos e chamar os métodos em um objeto. As listas e os dicionários Python são objetos e possuem atributos e métodos.
Atividade
Finalidade
Melhore sua capacidade de escrever código orientado a objetos.
Declaração do Problema
Existem vários tipos de comandos que são comumente encontrados em programas orientados a objetos. Esses tipos de comandos são tão comuns que um programador deve reconhecê-los e escrevê-los. Um desses tipos é chamar os métodos de um objeto usando o operador ponto (.), conforme mostrado neste modelo:
variavel = objeto.metodo(arg1, arg2,...)
Documentação Útil
-
Em Python, as listas são objetos com atributos e métodos, e um programador pode modificar uma lista chamando esses métodos. Os métodos de lista estão documentados em uma página da web chamada Mais sobre Listas.
Tarefa
Escreva um pequeno programa Python chamado frutas.py que demonstre programação orientada a objetos modificando uma lista. Faça o seguinte:
-
Abra um novo arquivo em branco no VS Code e salve-o como
frutas.py -
Copie e cole este código na parte de cima do seu programa de
frutas:def main(): # Cria e exibe uma lista chamada frutas. lista_de_frutas = ["pêra", "banana", "maçã", "manga"] print(f"original: {lista_de_frutas}") -
Adicione um código que inverta a ordem dos elementos da lista, de modo que o último se torne o primeiro, o penúltimo o segundo e assim por diante. Em seguida, exiba o conteúdo de lista_de_frutas. Caso não se lembre como inverter uma lista, consulte Mais sobre listas..
-
Adicione código para anexar "laranja" ao final de lista_de_frutas e exiba a lista.
-
Adicione código para encontrar onde "maçã" está localizado em lista_de_frutas e insira "cereja" antes de "maçã" na lista e exiba essa lista.
-
Adicione código para remover "banana" de lista_de_frutas e exiba a lista.
-
Adicione código para remover o último elemento de lista_de_frutas e exiba o elemento removido e a lista.
-
Adicione código para classificar e exibir lista_de_frutas.
-
Adicione código para limpar e exibir lista_de_frutas.
-
Na parte inferior do seu programa, escreva uma chamada para a função
main.
Procedimento de Teste
Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:
-
Execute seu programa e certifique-se de que a saída do programa seja a mesma que a mostrada abaixo.
> python frutas.py original: ['pêra', 'banana', 'maçã', 'manga'] invertida: ['manga', 'maçã', 'banana', 'pêra'] anexação de laranja ao final: ['manga', 'maçã', 'banana', 'pêra', 'laranja'] inserção de cereja: ['manga', 'cereja', 'maçã', 'banana', 'pêra', 'laranja'] remoção de banana: ['manga', 'cereja', 'maçã', 'pêra', 'laranja'] remoção de laranja: ['manga', 'cereja', 'maçã', 'pêra'] ordenada: ['maçã', 'cereja', 'manga', 'pêra'] vazia: []
Ponderar
Depois de terminar seu programa, examine o código em main e perceba que você escreveu código orientado a objetos quando usou lista_de_frutas e o operador ponto (.) para chamar os métodos reverse, append, insert, remove, pop, sort e clear.
Exemplo de Solução
Quando terminar seu programa, consulte o exemplo de solução para comparar com o seu.
Primeiro, procure concluir o programa sem olhar o exemplo de solução. No entanto, se já tiver trabalhado nele por bastante tempo e ainda estiver com dificuldades, sinta-se à vontade para usá-lo como apoio para finalizar seu programa.
Envio
Quando terminar, reporte seu progresso no questionário do Canvas correspondente a esta atividade.
Links Úteis:
- Voltar para: Visão Geral da Semana | Página Inicial