EP7
EP7 - Ah, gravity . . . - Parte I
``Ah, gravity - thou art a heartless bitch.'',
Dr. Sheldon Cooper MSc, PhD.,
Theoretical physicist,
California Institute of Technology
Objetivos
Neste exercício programa você praticará um pouco de programação orientada a objetos e trabalhará tópicos como:
- objetos: referências, clones, mutabilidade
- classes nativas versus classes definidas pelo usuário
- atributos de estado e métodos
- método especial construtor:
__init__()
- método especial:
__str__()
- sobrecarga de operadores e os métodos especiais:
__add__()
,__sub__()
,__mul__()
, etc.
Introdução
Um grupo de quatro tartarugas antropomórficas, adolescentes, e mutantes (Leonardo, Michelangelo, Donatello e Rafael), moravam no esgoto de Nova York, onde eram treinadas na arte ninja pelo rato, Mestre Splinter. Por conta de ``rixas antigas'' (fruto de disputas pela supremacia na arte ninja), mestre Splinter tinha desavenças com o líder de uma gangue de ninjas, chamado . Em função desses problemas mal resolvidos de seu mestre, as tartarugas tiveram que enfrentar os soldados do Destruidor em várias batalhas. Após derrotarem o terrível Destruidor, as tartarugas, já mais maduras, passaram a ter muitos questionamentos sobre o seu passado. A história contada por mestre Splinter acerca de suas origens parecia ser um tanto fantasiosa. Segundo Splinter, as quatro tartarugas caíram no esgoto, banhadas por uma substância estranha (líquido mutagênico), de modo que elas se mutaram em tartarugas com forma humana.
Donatello passou a desconfiar de que a versão contada por Splinter se tratava, na realidade, de uma "história da carochinha", dado que, em suas pesquisas, nunca havia conseguido comprovar algo semelhante. Após combaterem as forças invasoras de Krang (um alienígena da Dimensão X), as tartarugas tomaram conhecimento da existência de vida fora da Terra, aumentando ainda mais as suas especulações sobre suas possíveis origens. Suas suspeitas de que eram na verdade extraterrestres, se confirmaram quando Rafael descobriu uma foto antiga no meio das coisas velhas e empoeiradas de Splinter. A foto (Figura 1) apresentava a figura de uma tartaruga humanoide em traje de astronauta (``Turtlenauta'').
A decepção em relação ao Mestre Splinter, somada com as precárias condições de vida em um esgoto de Nova York, convivendo com um rato e não podendo subir à superfície devido ao assédio dos ``paparazzi'' (como a repórter ruiva April O'Neil do Canal 6, que constantemente desrespeitava os seus direitos de privacidade), levaram as tartarugas a uma decisão (Pesou também nessa decisão, o aumento do custo da base de sustentação alimentar das tartarugas, a pizza, devido ao preço elevado do molho de tomate.): elas viajariam pelo espaço em busca de suas verdadeiras origens, como peregrinos em busca de um sentido existencial.
No entanto, no dia do lançamento das naves (turtleships) do Programa Espacial Tartaruguiano, alguns repórteres/paparazzi entraram como clandestinos nas naves. Após a decolagem e saída da Terra, os repórteres causaram acidentalmente uma pane no sistema das naves, que fez com que os foguetes deixassem de funcionar, de modo que as tartarugas ficaram perdidas, a deriva no espaço, sob a ação das forças gravitacionais dos corpos celestes.
Será que as turtleships estão em órbita de algum astro (corpo celeste) no Espaço? Será que elas colidiram com algum desses astros? Neste exercício programa vocês terão a importantíssima missão de simular e investigar a trajetória (versão bidimensional) das turtleships, a fim de saber o que aconteceu com elas para que o Mestre Splinter possa planejar um resgate caso alguma ainda esteja intacta no espaço. Antes de prosseguirem na leitura desse enunciado, atenção, neste exercício-programa utilizaremos quilômetros (km) para medir distância, quilogramas (kg) para medir massa e horas para medir tempo.
Leis de Newton do movimento
O único ponto deste EP que utiliza a lei da gravitação universal é o método Astro.aceleracao_gravitacional()
. Sobre a lei de Newton necessária para escrever esse método, basta ler o texto que está aqui.
Programação orientada a objetos
Em Python, todo valor é um objeto. Uma lista, ou mesmo um inteiro, todos são objetos
6 é um objeto da classe int
3.14 é um objeto da classe float
[1,2,3] é um objeto da classe list
Para saber a classe de um objeto:
type(objeto)
>>> type(6)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("como é chato estudar MAC0122!")
<class 'str'>
>>> type([1,'oi',3.14,[3,4,5]])
<class 'list'>
>>> s = "oi"
>>> type(s)
<class 'str'>
>>>
Linguagens orientadas a objetos permitem aos programadores criarem novas classes.
A função print()
requer que o objeto se converta para um string que possa ser exibido, __str__()
é o método padrão que diz como o Python deve se comportar nessa situação.
Objetos
Um objeto contém as informações/valores de um tipo definido pelo programador.
Classes
Nós usamos muitas classes nativas do Python. Agora iremos definir novas classes. Em particular uma classe Vetor
e uma classe Astro
.
Classes são formadas por atributos que podem ser variáveis ou funções. As funções de uma classe são chamadas de métodos.
Usamos um ponto para nos referirmos a uma variável ou método de uma classe, como em lista.append()
.
A primeira letra em um nome de uma classe deve ser maiúscula.
Métodos
Métodos são funções são definidos dentro de uma classe.
Todo método de uma classe recebe como primeiro parâmetro uma referência ao objeto que chama o método.
Esse primeiro parâmetro é chamado de self
.
Construtor
O método especial __init__()
é responsável por construir um objeto referenciado por self
.
Chamado quando um objeto é criado.
Exibindo um objeto
O método especial __str__()
cria e retorna um string que diz como o objeto deve ser exibido por print()
.
Métodos especiais
Alguns dos métodos especiais do Python estão listados a seguir. Eles, se implementados, dizem como o Python deve se comportar quando o operador é utilizado com algum objeto da classe. Por exemplo, como realizar a + b
quando a
e b
são da classe Fracao
ou da classe Polinomio
ou da classe Vetor
.
Operador Método especial
+ __add__(self, other)
- __sub__(self, other)
* __mul__(self, other)
// __floordiv__(self, other)
/ __truediv__(self, other)
% __mod__(self, other)
** __pow__(self, other[, modulo])
- (unário) __neg__(self)
< __lt__(self,other)
<= __le__(self,other)
== __eq__(self,other)
!= __ne__(self,other)
>= __ge__(self,other)
> __gt__(self,other)
Glossário
-
atributo: Um dos itens nomeados de dados que compõem uma instância.
-
classe: Um tipo de composto definido pelo usuário. Uma classe também pode ser pensada como um modelo para os objetos que são instâncias da mesma. (O iPhone é uma classe. Até dezembro de 2010, as estimativas são de que 50 milhões de instâncias tinham sido vendidas!)
-
construtor: Cada classe tem uma fábrica, chamada pelo mesmo nome da classe, por fazer novas instâncias. Se a classe tem um método de inicialização, este método é usado para obter os atributos (ou seja, o estado) do novo objeto adequadamente configurado.
-
instância: Um objeto cujo tipo é de alguma classe. Instância e objeto são usados como sinônimos.
-
instanciar: Significa criar uma instância de uma classe e executar o seu método de inicialização.
-
linguagem orientada a objetos: Uma linguagem que fornece recursos, como as classes definidas pelo usuário e herança, que facilitam a programação orientada a objetos.
-
método: Uma função que é definida dentro de uma definição de classe e é chamado em instâncias dessa classe.
-
método de inicialização: Um método especial em Python, chamado
__init__()
, é chamado automaticamente para configurar um objeto recém-criado no seu estado inicial (padrão de fábrica). -
objeto: Um tipo de dados composto que é frequentemente usado para modelar uma coisa ou conceito do mundo real. Ele agrupa os dados e as operações que são relevantes para esse tipo de dados. Instância e objeto são usados como sinônimos.
-
programação orientada a objetos: Um estilo poderoso de programação em que os dados e as operações que os manipulam são organizados em classes e métodos.
O que você deve fazer
Neste EP7 você implementará duas classes. São elas
Vetor
no móduloNUSP_vetor.py
; eAstro
no móduloNUSP_astro.py
.
As especificações dessas classes e de seus métodos estão nos arquivos esqueleto_vetor.py
e esqueleto_astro.py
.
Roteiro
-
Faça o download dos arquivos
esqueleto_vetor.py
eesqueleto_astro.py
. -
Mude o nome do arquivo
esqueleto_vetor.py
paravetor.py
eesqueleto_astro.py
paraastro.py
. (Antes de entregar o seu EP, você deverá alterar o nome do arquivovetor.py
paraNUSP_vetor.py
e o nome do arquivoastro.py
paraNUSP_astro.py
, ondeNUSP
é o seu número USP.) -
Mude o nome do arquivo
esqueleto_vetor.py
paraNUSP_vetor.py
eesqueleto_astro.py
paraNUSP_astro.py
ondeNUSP
é o seu número USP. -
Abra os esqueletos no Spyder ou em qualquer outro editor ou ambiente apropriado para desenvolver programas em Python. Esses serão os arquivos que você deve editar.
- Leia e preencha o cabeçalho de cada arquivo com o seu nome, nusp, etc. Não modifique o resto do cabeçalho.
-
Antes de escrever cada método, leia atentamente a especificação do método e os exemplos.
-
Teste cada método separadamente das demais usando o console do Spyder (= Python Shell ou IPython). Você também pode usar para os testes um terminal.
- Após testar cada método de suas classes com vários exemplos, altere os nomes dos arquivos:
vetor.py
paraNUSP_vetor.py
eastro.py
paraNUSP_astro.py
.
NUSP_vetor.py
eNUSP_astro.py
. -
Não deixe de seguir as Instruções para entrega de EPs.
Entrega
A primeira entrega deve ser feita até o dia 17/10 (até 23h55m).
O EP receberá comentários no dia 18/10.
Uma nova versão poderá ser entregue até o dia 19/10 (até 23h55m).
- 12 outubro 2016, 00:19 AM
- 11 outubro 2016, 17:12 PM