1 of 23

POO em Python

Programação

Orientada a Objetos

(com Python)

Prof. Rodrigo Rocha <rodrigorgs@ufba.br>

Instituto de Computação

Universidade Federal da Bahia

2 of 23

Declaração de uma classe

Carro é o nome da classe

�Convenção de nome: iniciais maiúsculas

class Carro:

pass

2

3 of 23

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

4 of 23

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

5 of 23

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

6 of 23

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

7 of 23

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

8 of 23

Atributos e construtores

9 of 23

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

10 of 23

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()

11 of 23

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)

12 of 23

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;

13 of 23

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

14 of 23

Pensando com objetos

Na programação procedural, definiríamos as�seguintes funções:

calculaArea(largura, altura)

calculaPerimetro(largura, altura)

14

15 of 23

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

16 of 23

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

17 of 23

Slides antigos (desconsiderar)

18 of 23

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

19 of 23

⭐ 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

20 of 23

Identidade, igualdade e referência nula

21 of 23

Identidade e igualdade

21

22 of 23

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

23 of 23

⭐ 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