MCG126
–
Programação de
Computadores II
Prof. Isac Mendes Lacerda
Programação orientada a objetos
•
Orientação a Objetos
(OO)
é uma
abordagem
de
modelagem
e de
desenvolvimento
de software. Python
é uma linguagem que suporta os conceitos de OO;
•
A origem dos conceitos vem da década de 1960;
•
Esse paradigma foi desenvolvido para, principalmente:
– Facilitar modificações nos sistemas, sejam grandes, pequenos, simples ou complexos
Programação orientada a objetos
•
Até agora... Usamos o paradigma de
programação
procedural (estrutural/imperativo)
. Caracterizada por:
– Foco na escrita de funções que operam sobre os dados.– Os dados não pertencem às funções, eles são passados como parâmetros.
Programação orientada a objetos
•
Na
Programação Orientada a Objetos (POO)
, busca-se
compreender um problema como uma
coleção de
objetos
que interagem por mensagens. Caracterizada
por:
– Objetos são estruturas que contêm tanto estado (dados ou atributos) como comportamento (funções ou métodos)
– Objetos devem representar o mundo real;
– Objetos são categorizados por Classes
.
Animal
Programação O. Objetos
Programação
Estruturada
Programação orientada a objetos
Programação O. Objetos
Programação
Estruturada
Programação orientada a objetos
Mudança de perspectiva
Até agora...
•
Escrevemos funções e chamamos usando uma sintaxe
como:
calculeArea(círculo)
Mudança de perspectiva
Na programação orientada a objetos...
•
Os objetos são agentes ativos.
•
Por exemplo, nós escrevemos
círculo.calculaArea()
•
Que pede para o círculo calcular a sua área
Transferir a responsabilidade da função para um objeto
torna possível escrever funções mais versáteis e facilita a
Mudança de perspectiva
A vantagem mais importante da
POO
é que ela é mais
adequada ao
nosso processo mental
de
agrupamento
e
mais perto da nossa experiência do mundo real.
No mundo real:
-
cozinhar
é parte do nosso forno de microondas
Mudança de perspectiva
•
As funcionalidades de um objeto do mundo real tendem
a ser intrínsecas a esse objeto.
Objetos
•
Em Python
,
tudo
é na verdade um
objeto
•
Uma
lista
, uma
tupla
ou mesmo um
inteiro
, todos são
objetos
•
Programas
manipulam
esses
objetos
realizando
computações diretamente com eles ou chamando seus
métodos
(ou seja, pedindo que esses objetos executem
Classe: CARRO
Objetos
Exemplo: Carro
Corcel II do meu avô:
Atributos:
Cor: marrom Fabricante: Ford Modelo: Corcel II
Classes definidas pelo usuário
•
Em muitos casos precisaremos
criar objetos
de dados
relacionados ao problema
trabalhado
Classes definidas pelo usuário
Exemplo
: considere o conceito de um
ponto matemático
.
•
Em 2 dimensões, um
ponto é representado por dois
números
(coordenadas) que são tratados em conjunto
como um único objeto.
•
Os pontos são
escritos entre parênteses
com uma
vírgula separando as
coordenadas
.
•
Por
exemplo
(0,0)
representa a origem e
(x,y
)
representa
o ponto
x
unidades para direita e
y
unidades para cima
Classes definidas pelo usuário
Exemplo
: considere o conceito de um
ponto matemático
.
Classes definidas pelo usuário
Exemplo: considere o conceito de um ponto matemático.
• Algumas operações típicas que se associam com pontos:
– pedir o ponto a sua coordenada x (getX),
– pedir sua coordenada y (getY)
• Também pode calcular a distância de um ponto a partir da
Classes definidas pelo usuário
Classes definidas pelo usuário
Classes definidas pelo usuário
• Toda classe deve ter um método com nome especial __init__
• É um método de inicialização, também chamado de construtor
• É chamado automaticamente sempre que uma nova instância de Ponto é criada
• Configura os atributos necessários dentro da nova instância
• O parâmetro self é definido automaticamente para
Classes definidas pelo usuário
• Durante a inicialização dos objetos, criamos 2 atributos chamados x e y para cada um, ambos com valor 0
• Ao executar o programa, dois Pontos foram criados, cada um
com coordenadas x e y com valor 0.
Classes definidas pelo usuário
Classes definidas pelo usuário
• O operador is retorna Falso o que significa que eles são objetos
diferentes
• As variáveis p e q recebem referências a dois novos objetos Ponto
• A classe Ponto cria uma nova instância do objeto. O método
Classes definidas pelo usuário
• Uma classe é uma fábrica que faz objetos
• A classe em si não é uma instância de um ponto, mas contém estrutura para fazer pontos
• Cada vez que chamar o construtor, está pedindo à fábrica para lhe fazer um novo objeto
• À medida que o objeto sai da linha de produção, o seu
método de inicialização é executado para inicializá-lo com a
configuração padrão de fábrica
• O processo combinado de “criar um novo objeto” e “inicializar com a configuração padrão” é chamado de
Melhorando o nosso construtor
• Até agora o nosso construtor só pode criar pontos na posição (0,0)
• Para criar um ponto na posição (7,6) é preciso fornecer alguma capacidade adicional para passar informações para o construtor
Adicionando outros métodos
• Podemos acrescentar métodos para a classe Ponto que são úteis para trabalhar com pontos
• Criar uma classe como Ponto traz uma “capacidade de
organizar” os nossos programas e nosso pensamento
Adicionando outros métodos
• Um método se comporta como uma função
• Os métodos são executados em um objeto específico
• Vamos adicionar 2 métodos simples para permitir que um ponto forneça informações sobre seu estado:
– O método getX irá retornar o valor da coordenada x
– O método getY irá retornar o valor da coordenada y
Adicionando outros métodos
• Vamos adicionar outro método, distanciaDaOrigem
Adicionando outros métodos
Objetos como argumentos e parâmetros
• Podemos passar um objeto como um argumento da forma habitual (função comum)
• Observe a função distancia que envolve objetos Ponto
Conversão de um objeto para um string
• A função print produz um string que representa o Ponto p
• O padrão fornecido por Python diz que p é um objeto do tipo
Ponto
• Para melhorar esta representação incluímos o método
especial __str__
Conversão de um objeto para um string
• O método __str__ é responsável por retornar uma representação na forma de um string
• Em outras palavras, como programador a gente deve escolher como o Ponto deve ser impresso
• Nesse caso, decidimos que a representação em string irá incluir os valores de x e y e um texto de identificação.
Método especial, chamado quando print() é executada
Conversão de um objeto para um string
• Quando executar o programa observe que a função print agora mostra a string que escolhemos
• O Python fornece muitas implementações padrão para métodos que nós, como programadores, desejamos alterar
Instâncias e Valores de Retorno
• Funções e métodos podem retornar objetos
• Isso não é novidade, pois tudo em Python é objeto
• A diferença aqui é que nós queremos que o método crie um objeto usando o construtor e depois que retorne o novo objeto como valor do método
• Suponha que você tenha um objeto ponto e deseja encontrar o ponto médio entre ele e algum outro ponto alvo
Instâncias e Valores de Retorno
Alguns nomes...
• Atributo
Um dos itens nomeados de dados que compõem uma instância
• Classe
Um tipo composto definido pelo usuário. Uma classe também pode ser pensada como um modelo para objetos que são instâncias da mesma.
Ex. iPhone é uma classe. O seu iPhone é uma instância.
• Construtor
Alguns nomes...
• Instância
Um objeto cujo tipo é de uma classe. Instância e objeto são sinônimos
• Instanciar
Significa criar um objeto de uma classe
• Linguagem orientada a objetos
Alguns nomes...
• Método
Uma função que é definida dentro da fronteira de uma classe e é chamada em instâncias a partir dessa classe
• Objeto
Um tipo de dado composto que é frequentemente usado para modelar uma coisa ou conceito do mundo real. Ele agrupa dados e as operações que são relevantes para esse tipo de dados.
Exercício
1) Implemente a classe ao lado, considerando que seus atributos
devem ser informados pelo usuário. O método getX ()deve imprimir a coord. de X, getY() deve imprimir a coord. de Y, distânciaOrigem() deve calcular a distância desse ponto para a origem e reflexoX() deve retornar um novo ponto que é a reflexão do ponto no eixo x. Por exemplo, o
reflexo de (3,5) é (-3,5).
Exercício
1) Altere o programa anterior de
modo que dois pares de coordenadas sejam informados pelo usuário (x1, y1, x2, y2).Com isso, adicione o
Exercício
1) Crie a classe para representar frações. Quais atributos são
necessários? Os atributos devem ser informados pelo usuário. Implemente pelo menos dois métodos.
FRAÇÃO
Atributos:
????
Exercício
1) Crie a classe Televisão com os respectivos atributos e métodos. A mudança de canais deve estar
limitada entre 2 e 10.
Exercício
Início
Escreva um programa Orientado a Objetos que corresponda ao fluxograma abaixo (comumente usado para a programação
estruturada):
Obter altura do retângulo
Obter base do retângulo
Calcular área do retângulo
Frações
• Vamos desenvolver uma classe para representar uma fração incluindo alguns dos métodos mais comuns
• Quais seriam os atributos do objeto Fracao? Qual seu
estado?
Frações
• Uma fração é mais comumente vista como dois inteiros, um sobre o outro, com uma linha separando os dois.
• O número da parte superior é o numerador e da parte inferior é o denominador.
Frações
Frações
• Podemos começar a implementação da classe Fracao com o método __init__ que permitirá que o usuário forneça o numerador e o denominador da fração a ser criada....
Objetos são mutáveis
• Nós podemos mudar o estado de um objeto fazendo uma atribuição a uma das variáveis da instância.
Exercício
1) Crie uma classe para representar um retângulo. Quais são os atributos?
2) Crie os métodos get para cada atributo
3) Escreva o método perimetro na classe Retangulo para que retorne o valor do perímetro de uma instância de Retangulo 4) Escreva o método area na classe Retangulo que retorne o
Orientação a Objetos
•
Principais conceitos:
– Abstração– Classes
– Objetos
– Herança
– Polimorfismo
Orientação a Objetos
•
Abstração
:
– “A abstração é o processo de filtragem de detalhes sem importância do objeto, para que apenas as características apropriadas que o descrevem permaneçam”
(Peter Van Der Linden)
Orientação a Objetos
•
Classes
:
–
É um conjunto de objetos que pode ser definido por
propriedades e comportamentos.
Classe de animais
Classes de carros
Classe de móveis
Orientação a Objetos
•
Classes
:
–
A definição da
classe consiste
na definição dos
atributos
(propriedades)
e
métodos
(comportamentos) dos objetos desta classe;
–
Um
atributo é uma característica
de uma classe.
Atributos não apresentam comportamento, eles
definem a estrutura da classe;
–
Métodos caracterizam o comportamento
de um
Orientação a Objetos
•
Classes de Animais
:
–
Atributos:
• Possui corpo
• Possui aparelho digestivo
–
Comportamentos:
• Nascem e morrem
• Respiram
• Se alimentam
Orientação a Objetos
•
Classes de Carros
:
–
Atributos:
• Possui motor
• Possui rodas
–
Comportamentos:
• Aceleram
• Freiam
Orientação a Objetos
•
Objetos
:
–
Particularização de um elemento de uma classe.
O cachorro do Alfredo
O carro do Diretor
A mesa da sala
A maça da sobremesa
–
Diz-se que um objeto é uma instância de uma classe.
Orientação a Objetos
•
Herança
:
–
Capacidade
de
absorver
características
e
comportamentos de outra classe. Uma classe herda
de outra classe, que é chamada superclasse.
Orientação a Objetos
•
Herança
:
– Uma classe pode herdar a definição de outra classe
– Permite o uso ou extensão de métodos e atributos previamente definidos por outra classe
– Nova classe: subclasse
– Original: classe pai, ancestral ou superclasse
Orientação a Objetos (herança)
•
Herança
:
– Vamos implementar a classe Animal, Mamífero e Cachorro
– Quais atributos devem ter?
– Quais atributos um mamífero tem a mais?
Exercício
Exercício: implemente as classes Homem, Ave e Beija-Flor.
– Pense nos atributos e métodos de cada um
Orientação a Objetos (herança)
Outro exemplo: Avô, Pai e Filho.
Avô
Pai
Filho 1
Filho 2
Pai
Filho
Pai
Avô
Pai
Filho 1
A ausência do comando
super().__init__() no
construtor faz com que não haja atributos herdados, mas
Exercício (herança)
Eletrônico ligado=False ligar() desligar() get_ligado() Tablet volume=0 aumentar_volume() diminuir _volume() get_volume() Rádio tocando_música=False tocar_música() parar_música() get_tocando_música()Orientação a Objetos
•
Polimorfismo
:
–
Significa
muitas formas
–
Ocorre quando uma classe possui um
método com o
mesmo nome
e assinatura (número, tipo e ordem de
parâmetros) de um método na sua superclasse, mas
diferencia-se pela lógica de implementação.
–
Ex: Operador “+” em
Python
Orientação a Objetos
Exercício (polimorfismo)
Funcionário nome salário_base calcular_salário() mostrar_salário() Vendedor comissão Freelancer dias_trabalhadosOrientação a Objetos
•
Encapsulamento
:
–
Esconder os detalhes da implementação de um objeto
–
A capacidade de um objeto possuir uma parte
privada, acessível somente através dos métodos
definidos na sua interface pública;
Orientação a Objetos
•
Encapsulamento:
– Atributos e métodos podem ser públicos ou privados.
– Público significa que ele pode ser visível/alterável fora da classe que o define.
– Privado indica que ele só é visível/alterável dentro da classe que o define.
– Python difere um do outro através do nome, se o nome do atributo/método iniciar com dois traços inferiores ele será considerado privado.
Método público e privado
Orientação a Objetos
•
Exemplo: TV
Orientação a Objetos
•
Exemplo: TV
Quais atributos?
Orientação a Objetos
Orientação a Objetos
Orientação a Objetos
Orientação a Objetos
Orientação a Objetos
•
Exemplo: TV
Orientação a Objetos
•
Exemplo: TV
Orientação a Objetos
•
Atributos de classe
:
o Trabalhamos até aqui com atributos do objeto, lembrando
que sempre usamos o pré-fixo self. para utilizá-lo.
o Podemos também criar um atributo de classe.
Significando que este atributo pertence a classe e não a um objeto específico.
o O atributo de classe pode ser acessado por qualquer
objeto, mas existirá um único atributo para a classe específica.
Orientação a Objetos
•
Exemplo: TV
Orientação a Objetos
•
Exemplo: TV
Como controlar quantas TVs são construídas?