POO em Python
Programação
Orientada a Objetos
(com Python)
Prof. Rodrigo Rocha <rodrigorgs@ufba.br>
Instituto de Computação
Universidade Federal da Bahia
Declaração de uma classe
Carro é o nome da classe
�Convenção de nome: iniciais maiúsculas
class Carro:
pass
2
Declaração de um método
Métodos são sempre declarados dentro de classes e recebem como primeiro parâmetro o objeto (self)
Convenção de nome: letras minúsculas; palavras separadas por underscore (_)
class Carro:
def anda(self, und):
# ...
def esta_ligado(self):
return true
3
Chamada de método
O método anda() chama o método esta_ligado()
Note o uso de self para chamar métodos do mesmo objeto.
class Carro:
def anda(self, und):
if self.esta_ligado():
print("Vruuum!")
def esta_ligado(self):
return true
4
Instanciação
Para criar uma instância (objeto) da classe Carro:
Carro()
�Guardando em uma variável:
c1 = Carro()
c2 = Carro()
💡 As variáveis c1 e c2 guardam o mesmo objeto ou objetos diferentes?
5
Chamada de método de outro objeto
Considere a variável fusca, que guarda um objeto da classe Carro:
fusca = Carro()
Para chamar um método no objeto, use a notação de ponto:
fusca.liga()
fusca.acelera()
6
Variáveis locais
Você pode declarar variáveis locais dentro dos métodos: elas são criadas quando o método é chamado, e destruídas quando ele termina sua execução.
Exemplo: variável quadrado
class Matematica:
def hipotenusa(self, a, b):
quadrado = a * a + b * b
return math.sqrt(quadrado)
7
Atributos e construtores
Construtores
Cada classe define um construtor, que é um método especial, chamado automaticamente no momento da criação de um objeto, com o objetivo de inicializá-lo
Assim como métodos tradicionais, podem receber parâmetros, mas não podem retornar um valor
Construtores normalmente inicializam atributos
9
Construtores
O construtor tem o nome __init__ e recebe pelo menos um parâmetro, que é o objeto a ser inicializado.
Por convenção, o primeiro parâmetro (o objeto) é nomeado self.
10
class Retangulo:
def __init__(self):
self.largura = 0
self.altura = 0
# Ao criar um objeto do�# tipo Retangulo, o
# construtor é chamado
r = Retangulo()
Construtores
Nesse caso é obrigatório fornecer largura e altura ao criar um objeto do tipo Retangulo
11
class Retangulo:
def __init__(self, largura, altura):
self.largura = largura
self.altura = altura
r1 = Retangulo(3.0, 4.0)
r2 = Retangulo(8.0, 8.0)
Atributos (variáveis de instância)
São variáveis criadas e destruídas junto com o objeto (instância) ao qual pertencem
O conjunto de atributos e seus valores é chamado de estado de um objeto
Podem ser lidos ou alterados por qualquer método do objeto
12
class Carro:
def __init__(self):
self.velocidade = 0.0
def acelera():
self.velocidade += 1.0;
Objeto = métodos + atributos
Uma classe declara, portanto, um conjunto de métodos (que define o comportamento dos seus objetos)...
… e inicializa um conjunto de atributos (que vão compor o estado dos seus objetos)
Métodos e atributos são chamados de membros de uma classe.
13
Pensando com objetos
Na programação procedural, definiríamos as�seguintes funções:
calculaArea(largura, altura)
calculaPerimetro(largura, altura)
14
Pensando com objetos
Na programação OO, as medidas do retângulo são passadas ao construtor no momento da criação do objeto:
r = Retangulo(largura, altura)
Por isso, os métodos não recebem parâmetros:
r.area()
r.perimetro()
15
Abstração
Classes definem uma abstração: um modelo simplificado de algum conceito
Carros na vida real possuem portas, rodas, motor, posição, velocidade, cor… Uma classe Carro vai representar apenas uma parte disso, a depender da aplicação
16
Slides antigos (desconsiderar)
Acesso a atributos
Para definir uma velocidade:
c1 = Carro()
c1.velocidade = 60
Para ler a velocidade:
print(c1.velocidade)
💡 As variáveis c1 e c2 guardam o mesmo objeto ou objetos diferentes?
18
⭐ Exercício: Edite a classe Rua; abaixo de super(600, 400, 1), escreva código para criar mais um carro e adicioná-lo à rua; para isso, use o método herdado addObject.
19
Identidade, igualdade e referência nula
Identidade e igualdade
21
Você define o que é ser igual
equals() é só mais um método; você pode implementá-lo do jeito que quiser na sua classe
Neste exemplo, consideramos duas pessoas iguais se possuem o mesmo CPF
public class Pessoa {
private String nome;
private String cpf;
public boolean equals(Object o) {
Pessoa outra = (Pessoa)o;
return cpf.equals(outra.cpf);
}
}
22
⭐ Exercício: permita que a aceleração seja definida diferentemente para cada carro, no momento de sua criação; dentro da classe Rua, crie dois carros com acelerações diferentes.
23