Introdução à Programação Aula 21: Programação com objetos Rita P. Ribeiro 2017/2018 Departamento de Ciência de Computadores
Nesta aula 1. Programação com objetos 2. Exemplo: módulo turtle 3. Tipos de dados 4. Definição de classes 5. Exemplo: contas bancárias INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 1
Programação com objetos
Programação com objetos Programação procedimental e funcional: decompomos problemas em sub-problemas; compomos programas definindo funções e procedimentos. Programação com objetos: agregamos dados e operações em entidades chamadas objetos; compomos programas definindo objetos que interagem. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 2
O que é um objeto? É uma entidade que agrega dados e operações sobre eles. Permite agrupar conceitos e funcionalidade relacionados Propriedades dos objetos: identidade podemos distinguir um objeto de qualquer outro; estado valores internos ao objeto; comportamento operações que o objeto expõe ao exterior (métodos). INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 3
Exemplo: módulo turtle
Módulo turtle Até agora usamos o turtle de forma procedimental. Este módulo também pode ser usado com objetos. Cada tartaruga é um objeto: estado a posição e orientação, côr do traço, etc.; comportamento métodos para movimentar e desenhar (forward, left, right, etc); identidade podemos criar múltiplas tartarugas distintas na janela. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 4
Módulo turtle (cont.) >>> import turtle >>> alice = turtle.turtle() # uma tartaruga >>> bob = turtle.turtle() # outra tararuga >>> alice.forward(200) # mover a Alice >>> bob.left(90) # mudar estado do Bob >>> bob.pencolor( blue ) >>> bob.forward(100) # mover o Bob INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 5
Módulo turtle (cont.) INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 6
Estado Cada tartaruga guarda um estado: a sua posição e orientação; a cor da caneta e espessura do traço;... >>> alice.position() (200.00,0.00) >>> bob.position() (0.00,100.00) >>> alice.heading() 0.0 >>> bob.heading() 90.0 INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 7
Identidade Podemos distinguir as duas tartarugas. >>> alice <turtle.turtle object at 0xfba3d0> >>> bob <turtle.turtle object at 0x7f2dac171390> >>> alice == bob False As duas tartarugas são diferentes mesmo se estiverem na mesma posição e com a mesma orientação! INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 8
Construtores Turtle é o construtor de objetos tartaruga (não confundir com o nome do módulo turtle) Usamos como uma função sem argumentos: >>> import turtle >>> alice = turtle.turtle() Alternativa >>> from turtle import * >>> alice = Turtle() Turtle é uma classe: define as operações comuns a todas as tartarugas; um molde para fabricar objetos (instâncias). INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 9
Passeio aleatório Vamos refazer o passeio aleatório de turtle graphics usando objetos. cada tartaruga é um objeto; escolhemos ângulos aleatórios para cada uma. Vantagem dos objetos: é fácil alterar o programa para simular várias tartarugas. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 10
Um passo da simulação def step(ts, a): "Passeio aleatório de várias tartarugas." # ts: lista de tartarugas; a: angulo máximo length = 10 # medida de cada passo for t in ts: # para cada tartaruga if visivel(t): angle = random.randint(-a,a) t.left(angle) else: angle = t.towards(0,0) t.setheading(angle) t.forward(length) INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 11
Testar se uma tartaruga está visível def visivel(t): "Verifica se a tartaruga t está visivel." w = 0.5*turtle.window_width() h = 0.5*turtle.window_height() (x,y) = t.position() return (x<w and x>=-w and y<h and y>=-h) INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 12
Programa principal alice = turtle.turtle() # criar 3 tartarugas bob = turtle.turtle() carol = turtle.turtle() alice.speed(0) bob.speed(0) carol.speed(0) alice.pencolor( red ) bob.pencolor( blue ) carol.pencolor( darkgreen ) for i in range(200): # executar 200 passos step([alice,bob,carol], 30) INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 13
Exemplo de execução INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 14
Tipos de dados
Tipos de dados Os tipos pré-definidos em Python são objetos: tipos básicos int, float, bool tipos estruturados str, list, tuple, dict INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 15
Tipos de dados (cont.) Exemplos: >>> txt = banana >>> txt.count( a ) 3 >>> xs = [1,1,2,3,3,4] >>> type(xs) <class list > >>> xs.count(3) 2 >>> xs.append(1) >>> xs.count(1) 3 >>> xs.remove(4) >>> xs [1, 1, 2, 3, 3] INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 16
Definição de classes
Classes Objetos dum mesmo tipo pertencem à mesma classe: todos os objetos duma classe têm os mesmos métodos; cada objeto duma classe tem o seu estado e identidade privados. Exemplo: módulo turtle. os objetos tartaruga pertencem à classe Turtle; todos suportam os mesmo comandos; os valores de posição, orientação, etc. são específicos de cada objeto. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 17
Definição de classes Podemos também definir novas classes para novos tipos de dados. class nome:. definições de métodos. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 18
Exemplo: contas bancárias
Contas bancárias Vamos definir uma classe para contas bancárias: estado titular e valor depositado; métodos depositar, levantar e transferir valores. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 19
Contas bancárias (cont.) Inicialização class Conta: "Classe para representar uma conta bancária." def init (self): self.titular = "" # titular da conta self.balanço = 0 # balanço inicial INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 20
Atributos Podemos definir estado associado ao objeto usando atributos. >>> conta = Conta() >>> conta.titular = "Pedro" >>> conta.balanço = 1000 O objeto tem dois atributos: uma cadeia e um inteiro. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 21
Atributos (cont.) Podemos aceder aos atributos de um objeto com a notação objeto.atributo: modificar o seu valor; usar em expressões. >>> conta.titular Pedro >>> conta.balanço += 200 >>> conta.balanço 1200 INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 22
Métodos class Conta: "Classe para representar uma conta bancária."... def depositar(self, valor): self.balanço += valor def levantar(self, valor): self.balanço -= valor O primeiro argumento (self) é o objeto sobre o qual opera O segundo argumento (valor) é o valor a depositar ou levantar Ambos os métodos modificam o balanço da conta INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 23
Exemplo de uso >>> conta = Conta() >>> conta.balanço = 1000 >>> conta.depositar(200) >>> conta.balanço 1200 >>> conta.levantar(50) >>> conta.balanço 1150 INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 24
Inicialização Podemos usar o inicializador para definir valores para os atributos. class Conta:... def init (self, nome): self.titular = nome self.balanço = 0 # titular da conta # balanço inicial... INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 25
Inicialização (cont.) >>> conta = Conta("Pedro") >>> conta.depositar(200) >>> conta.titular Pedro >>> conta.balanço 200 INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 26
Conversão para texto Por omissão não é muito informativa: >>> conta = Conta("Pedro") >>> print(conta) < main.conta object at 0x7fd15f7ffb10> >>> str(conta) < main.conta object at 0x7fd15f7ffb10> INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 27
Conversão para texto (cont.) Podemos definir o método str para converter o objeto para texto; deve retornar uma cadeia. class Conta:... def str (self): return "%s : %d EUR" % (self.titular,self.balanço) >>> conta = Conta("Pedro") >>> conta.depositar(200) >>> print(conta) Pedro : 200 EUR >>> str(conta) Pedro : 200 EUR INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 28
Transferências Podemos tranferir valores de uma conta para outra. >>> c1 = Conta("Pedro") >>> c1.depositar(1000) >>> c2 = Conta("Beatriz") >>> c1.levantar(300) >>> c2.depositar(300) >>> print(c1) Pedro : 700 EUR >>> print(c2) Beatriz : 300 EUR Vamos definir um método para automatizar este processo. INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 29
Transferências (cont.) class Conta:... def transferir(self, valor, dest): # transferir da conta self para dest self.levantar(valor) dest.depositar(valor) >>> c1 = Conta("Pedro") >>> c1.depositar(1000) >>> c2 = Conta("Beatriz") >>> c1.transferir(300, c2) >>> print(c1) Pedro : 700 EUR >>> print(c2) Beatriz : 300 EUR INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 30
Encapsulamento Optámos por usar métodos levantar() e depositar() para fazer a transferência Podíamos ter modificado os atributos diretamente: def transferir(self, valor, dest): self.balanço -= valor dest.balanço += valor A primeira opção garante encapsulamento: o estado interno de cada objeto só é acedido pelos seus métodos INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 31
Encapsulamento (cont.) INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 32
Encapsulamento (cont.) Em Python não podemos proibir o acesso aos atributos de objetos Contudo: é boa prática limitar o acesso aos atributos aos métodos do objeto Podemos definir métodos só para consultar o valor de atributos. class Conta:... def saldo(self): # retornar o balanço atual return self.balanço INTRODUÇÃO À PROGRAMAÇÃO - 2017/2018: AULA 21 33