You are on page 1of 129

I Jornada Acadêmica de Ciência, Tecnologia e Cultura

Minicurso de Python
Conceitos Básicos, Estruturas de Dados
e Orientação a objetos
Francisco A. S. Souza
Sobre o autor
• 19 anos :)
• Aluno do quarto módulo do curso Técnico de
Informática do Cefetes, Uned Cachoeiro de
Itapemirim;
• O resto é resto ;P
O que é Python?
• Python é uma linguagem de programação de altíssimo
nível (VHLPL – very high level programming
language), interpretada, orientada a objetos, de
tipagem forte e dinâmica criada por Guido van
Rossum em 1991.
• A linguagem tem um modelo de desenvolvimento
aberto mantido pela PSF (Python Software
Foundation).
O que é Python?
• A linguagem foi projetada com a filosofia de enfatizar
a importância do esforço do programador sobre o
esforço computacional. Prioriza a legibilidade do
código sobre a velocidade ou expressividade.
Quem usa Python?

• Atualmente Python é uma das linguagens mais


utilizadas em grandes projetos no mundo.
Engenheiros de software de empresas como Google
afirmam que o uso de Python é essencial para o
funcionamento de famosas ferramentas do Google.
“C++ quando necessitamos, Python quando
podemos”.
• As ferramentas Google Doc, Picasa, Orkut Help,
dentre outras da empresa americana Google utilizam
a linguagem Python.
Quem usa Python?
• Grande parte da API do Google é desenvolvida em
Python.
• O Google App Engine (framework web online mantido
pelo Google) oferece suporte total a Python e foi
desenvolvido também em Python.
• Zope, um dos melhores servidores de aplicação da
atualidade foi desenvolvido em Python.
Quem usa Python?
• Plone, que é uma aplicação do Zope, foi desenvolvido
em Python e é utilizado largamente em diversos web
sites: Governo Brasileiro, Portal da Câmara dos
Deputados, CEFET-Campos, PyCon Brasil, Novell, Free
Software Foundation, etc.
• Diversas empresas que fabricam distribuições Linux
utilizam softwares personalizados feitos em Python:
Novell (SuSE e Open SuSE), Canonical (Ubuntu), Red
Hat, dentre outras.
• A Microsoft também investe fortemente em Python, no
desenvolvimento da linguagem para o .NET
Framework
Quem usa Python?
• Empresas que patrocinam a Python Software
Foundation: ActiveState; ASTi; Array BioPharma,
Inc.; BizRate.com; Canonical; CCP Games; cPacket
Networks; EarnMyDegree.com; Enthought, Inc.;
Google; HitFlip, Inc.; IronPort Systems; Madison
Tyler LLC; Merfin LLC; Microsoft; O'Reilly &
Associates, Inc.; Opsware, Inc.; Strakt Holdings,
Inc.; Sun Microsystems; Tabblo; ZeOmega; Zope
Corporation.
Por que usar Python?
• Python é portável, você não precisa compilar seu
programa cada vez que muda de sistema operacional,
basta apenas que exista um interpretador Python
instalado.
• Python é open-source com licença flexível, há uma
comunidade que desenvolve a linguagem, que está
sempre aprimorando-a e qualquer um de nós pode
fazer parte dessa comunidade. A licença flexível nos
permite desenvolver softwares proprietários com
ferramentas livres.
Por que usar Python?
• Python é simples e auto-descritiva, algumas
linguagens de programação têm sintaxe complexa ou
difícil de memorizar.
• Vejamos alguns exemplos de código para declarar
uma classe (Faladora) que tem o método público
dizerOi que recebe uma string que representa o nome
de alguma pessoa e escreve uma mensagem de boas
vindas para esta pessoa na tela. Instanciaremos um
objeto falador da classe e chamaremos este método.
Por que usar Python?

• PHP:

<?php
class Faladora {
public function dizerOi($nome){
echo "Olá $nome! <br />";
}
}

$falador = new Faladora();


$falador->dizerOi(“Francisco”);
?>
Por que usar Python?
class Faladora {
• C++: public:
void dizerOi(string* nome);
};

void Faladora::dizerOi(string* nome){


cout << “Olá” << nome->c_str() << “!” << endl;
}
int main(void) {
Faladora* falador = new Faladora();
falador->dizerOi(new string(“Francisco”));
}
Por que usar Python?
• Java:
package minicurso;

public class Faladora {


public void dizerOi(String nome) {
System.out.println("Olá “ + nome + "mundo!");
}

public static void main(String[] args) {


Faladora falador = new Faladora();
falador.dizerOi(“Francisco”);
}
}
Por que usar Python?

• Python:

class Faladora:
def dizerOi(self, nome):
print("Olá %s!") %(nome)

falador = Faladora()
falador.dizerOi(“Francisco")
Por que usar Python?
• Note que é simples e objetivo! :)
• A presença de um interpretador interativo (assim
como Ruby) também é uma vantagem, pois é
interessante para iniciantes utilizarem um
“interpretador de comandos”.
• Vamos brincar um pouco com o interpretador?
Utilizando o interpretador
• Para executar o interpretador no Windows, vá em
Iniciar > Executar e digite python.
• Vale lembrar que o Python deve estar devidamente
instalado.
• É possível que não funcione desta forma, pois o
Python pode não estar configurado no PATH do
Windows, neste caso é necessário achar o diretório de
instalação do Python e executar o arquivo python.exe.
Utilizando o interpretador
Utilizando o interpretador
• Para executar o interpretador no Linux, abra o
terminal e digite “python”.
• Todas as distribuições Linux que trazem interface
gráfica hoje vêm com o Python instalado, já que
diversos softwares para este sistema operacional são
feitos em Python. Desta forma, geralmente não é
necessário instalar o Python em distribuições Linux.
Utilizando o interpretador
Utilizando o interpretador
Utilizando o interpretador
• Alguns comandos básicos do interpretador:
help()
import this
• E o nosso primeiro comando conhecido em Python:
print(“Olá mundo!”)
Resumo de características
• Case sensitive;
• Tipagem dinâmica e forte;
• Linguagem pura: 100% orientada a objetos;
• Código auto-descritivo: simples e de fácil leitura;
• Programação em alto-nível: não permite manipulação
de ponteiros;
• Não suporta sobrecarga de funções;
• Visa facilitar o desenvolvimento, foco em
produtividade. :)
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Sintaxe
if x > y:
big = x
small = y
else:
big = y
small = x

Simples e objetivo! Não é preciso saber


programação para entender este
código, basta um conhecimento básico
em inglês!
Variáveis
• O conceito de variável em Python é representado
sempre por um objeto. Na verdade, Python é uma
linguagem pura, ou seja, tudo em Python é um
objeto.
• Toda variável é uma referência!
• Variáveis armazenam endereços de memória e não
valores!
Variáveis
• Python possui tipagem dinâmica e forte;
• Tipagem dinâmica significa que a variável assume o
tipo de acordo com o valor atribuído;
• Tipagem forte significa que se uma variável é do tipo
inteiro, ela deve ser tratada como um inteiro, ou
convertida para ser tratada de outra forma;
• Para mudar o tipo de uma variável, devemos declará-
la novamente;
Variáveis
Qual o tipo de n1?

Qual o tipo de n2?


n1 = "10"
n2 = 19

O que acontece aqui?


soma = n1 + n2
Lendo do Teclado
• Em Python, a leitura de dados do teclado é feita
através das funções raw_input e input.

nome = raw_input("Digite seu nome: ")


idade = input("Digite sua idade: ")
print("Digite seu sexo: ")
sexo = sys.stdin.readline()

A função input “adivinha” o tipo


digitado e retorna. CUIDADO!
A função raw_input sempre
retorna uma string.

Assim funciona, mas você não


precisa disso! ;)
Escrevendo na Tela
• Para escrita na tela, utilizamos o comando print. Vale
lembrar que o print não é uma função (passará a ser
na versão 3.0 do Python).
• Porém, utilizaremos o print do futuro! Utilizaremos o
print como função.
Escrevendo na Tela

print "Pulei linha"


print "Não pulei linha",
Python 3.0
Python 2.x
print("Pulei linha")
print("Não pulei linha", end="")
Lendo e Escrevendo em
Arquivos
• Leitura de arquivos em Python é simples como em C!
• Arquivos são objetos do tipo file;
• Para a abertura de um arquivo, utilizamos a função
open;
• A função open funciona como uma fábrica de
instâncias.
Lendo e Escrevendo em
Arquivos

arquivo = open("entrada.txt")
Abrindo o arquivo
para leitura Imprimindo uma linha do arquivo a cada duas
linhas da tela.
for linha in arquivo:
print(linha) Imprimindo uma palavra por
linha
for linha in arquivo:
linha = linha.replace("\n", "")
palavras = linha.split('\t')
for palavra in palavras:
print(palavra)
Operadores
• Os operadores do Python:

Aritméticos Comparação Lógicos


+ == and
- != or
* > not
/ <
>=
<=
in
is
Módulos
• Módulo é o agrupamento de comandos para o
operador. Numa definição mais informal, módulo é um
arquivo de código-fonte Python.
• Módulos são arquivos definidos com as extensões
.py, .pyc, .pyo, .pyw, dentre outras menos utilizadas.
• Nossos módulos terão sempre a extensão .py, pois se
trata da extensão para código fonte de execução em
terminal.
• Em Python é possível definir mais de uma classe por
arquivo (módulo).
Strings
• Conheceremos rapidamente strings em Python e como
manipulá-las.
• A string em Python é representada pela classe str.
Toda string possui estado e comportamento provido
pela classe str.
Strings
• Conheceremos agora alguns métodos para trabalhar
com strings:
– __len__(): Retorna o tamanho da string;
– __getslice__(inicio, fim): Retorna uma substring de
inicio até fim.
– capitalize(): Retorna a mesma string com a
primeira letra em maiúsculo.
– upper(): Retorna a mesma string com todas as
letras em maiúsculo.
– lower(): Retorna a mesma string com todas as
letras em minúsculo.
Strings
• Mais métodos:
– replace(antigo, novo): Retorna a mesma string com
o valor novo em todas as ocorrências de antigo.
– split([separador]): Retorna uma lista de strings.
Caso o separador não seja especificado, a lista será
dividida por espaços em branco.
Strings

string = "Este eh apenas um teste com a string"


print(string.__len__())
print(string.__getslice__(0, 5))
print(string.upper())
print(string.capitalize())
print(string.lower())
print(string.replace("eh", "foi"))
print(string.split())
Estruturas de Dados
• Estruturas de dados englobam tipos compostos e
dados complexos;
• As estruturas de dados mais famosas são vetores e
matrizes. Dentre as mais avançadas, a mais conhecida
é a lista.
• Há ainda outras estruturas como árvore, pilha, fila,
hash, etc.
• Vale lembrar que uma string também é uma estrutura
de dados!
• Estudaremos três estruturas: List, Tuple e Dict.
Estruturas de Dados: List
• A list (lista) é uma das mais conhecidas estruturas de
dados.
• Em Python, a lista tem estado e comportamento que
faz uma espécie de mistura entre o comportamento de
vetores (acesso rápido por índices) e listas
(“iterabilidade”);
• Aviso aos programadores PHP: Em Python não é
permitido adicionar novos elementos em uma lista
“criando” um índice, é necessário utilizar o método
append() para adicionar um novo elemento!
Estruturas de Dados: List
• Antes de por a mão na massa, um simples exemplo:

alunos = []
alunos.append("Monica")
alunos.append("Cascao")
alunos.append("Cebolinha")

alunos.reverse()

for nome in alunos:


print nome
Estruturas de Dados: List
• Agora vamos fazer a mesma coisa, de forma
diferente:

alunos = ["Monica", "Cascao", "Cebolinha"]

alunos.reverse()
tamanho = alunos.__len__()
i = 0

while i < tamanho:


print(alunos[i])
i += 1
Estruturas de Dados: List
• Veremos agora alguns métodos para trabalhar com
listas:
– append(elemento): adiciona elemento ao fim da
lista.
– count(elemento): retorna um inteiro contendo a
quantidade de vezes que elemento aparece na lista.
– reverse(): inverte a ordem dos elementos da lista.
– remove(elemento): remove da lista o primeiro
elemento encontrado.
Estruturas de Dados: List
teste = ["Nome1", "Nome2", "Nome3"]

teste.append("Nome4")
teste.append("Nome2")
print(teste.count("Nome2"))
teste.reverse()
teste.remove("Nome2")

print(teste)
Gerando Listas
• Python possui formas de gerar listas, veremos duas;
• Uma das primeiras funções que todos aprendem em
Python é a função range, que gera uma lista de
inteiros;
Gerando Listas

lista1 = range(1500)

lista2 = range(1001, 2000)


Gera uma lista de 0 até
1499.

Gera uma lista de 1001


até 1999.
Gerando Listas
• Há ainda uma forma “avançada” de gerar listas a
partir de outras listas;
• Trata-se da técnica List Comprehension (Compreensão
de Listas);
• A sintaxe de List Comprehension vem da linguagem
funcional Haskell;
• O nome e a sintaxe originam da Matemática:
Compreensão de listas tem sintaxe praticamente igual
à notação axiomática de compreensão (Teoria de
Conjuntos);
Gerando Listas
• Supondo que seu amado professor de algoritmos lhe
passou o seguinte exercício: “Elabore um algoritmo
que leia um número x e imprima todos os ímpares
entre 0 e x”.
• Bom, nosso primeiro pensamento é fazer assim:

x = int(raw_input("Digite um inteiro: "))


numeros = range(x + 1)

for z in numeros:
if z % 2 == 1:
print(z)
Gerando Listas
• Não estamos programando em Java!

x = int(raw_input("Digite um inteiro: "))


impares = [z for z in xrange(x + 1) if z % 2 == 1]
for n in impares:
print(n)

Matemática

z : z pertence a lista e z for ímpar.


Estruturas de Dados: Tuple
• Tuplas são como as listas, a diferença é que tuplas
são estruturas de dados imutáveis.
• Pode-se dizer que, em Python, uma string é uma tupla
de caracteres.
• Vamos a um exemplo para melhor compreensão.
Veremos primeiro o que não é possível fazer com
tuplas.
Estruturas de Dados: Tuple

TypeError: 'tuple' object does not support


item assignment

tupla = ("Teste 1", "Teste


2")
tupla[0] = "Teste 3"
tupla.append("Teste 4")

AttributeError: 'tuple' object has no


attribute 'append'
Estruturas de Dados: Tuple
• Vale lembrar que da mesma forma que fazemos com
strings, também podemos concatenar tuplas.

tupla = ("Teste1", "Teste2", "Teste3")


tupla += ("Teste4", "Teste5", "Teste6")

tupla2 = ("Teste7", "Teste8", "Teste9")


tuplas = tupla + tupla2
Estruturas de Dados: Dict
• Chamaremos dicts de dicionários, para facilitar a fala
em português;
• Um dicionário é uma estrutura de dados onde cada nó
é composto por uma chave e um valor;
• Têm este nome pois são praticamente a mesma coisa
que um dicionário!
Estruturas de Dados: Dict
dicionario = {}
dicionario["teste"] = "A palavra teste significa que estamos
testando"
dicionario["testado"] = "A palavra testado significa que algo jah
passou por um teste"
dicionario["testando"] = "A palavra testando significa que algo
estah passando por um teste"

pessoas = {"Maria" : "Nome antigo", "Shyana" : "Nome complicado"}


Estruturas de Dados: Dict
• Alguns métodos de manipulação de dicionários:
– get(indice): retorna o valor correspondente a indice.
– items(): retorna uma lista de tuplas, no formato
(índice, valor).
– values(): retorna uma lista com todos os valores do
dicionário.
– keys(): retorna uma lista com todas as chaves do
dicionário.
– clear(): remove todos os itens do dicionário.
Estruturas de Dados: Dict
pessoas = {"Maria" : "Nome antigo", "Shyana" : "Nome complicado"}

print(pessoas.get("Maria"))
print(pessoas.items())
print(pessoas.values())
print(pessoas.keys())
pessoas.clear()
print(pessoas)
Controle de fluxo

if n1 > n2: while i < 5:


maior = i += 1
n1
else:
maior =
n2
Blocos de código definidos
por endentação!

numeros = [21, 5, 10]


O for do Python funciona como o for numero in numeros:
foreach do PHP e do Fortran 90, print(numero)
ou o enhanced for do Java, ou
seja, é percorrida uma estrutura
de dados, pegando elemento por
elemento da estrutura.
(Blocos de código)
• Como todos já perceberam, em Python não utilizamos
caracteres ou palavras para delimitar blocos de
código.
• Em C e linguagens derivadas, utilizamos o {}, em
Pascal utilizamos begin .. end.
• Em Python, o que determina o início e o fim de um
bloco é endentação.
Prática
• Faça um algoritmo que leia um número x e imprima a
soma de todos os ímpares entre 1 e x;
• Desafio: faça o algoritmo acima sem usar controle de
fluxo.
Orientação a Objetos em
Python
Orientação a objetos
• Python é uma linguagem 100% orientada a objetos,
significa que tudo em Python é um objeto!
• Veremos nos próximos slides como definir classes,
atributos, métodos e como aplicar em Python diversos
conceitos da Orientação a Objetos.
Definindo Classes
class Veiculo(object):
pass

Palavra class tipicamente utilizada Palavra reservada pass, siginifica:


para definir classes! (: passe este bloco.
Prática
• Defina a classe vazia “Tamagoshi”.
Definindo Atributos
• Existem duas formas de definir atributos de instância
em Python;

class Veiculo(object):
pass

fusca = Veiculo()
fusca.marca = "Volkswagen"
fusca.ano = 1972

class Veiculo(object):
marca = None
ano = None

gol = Veiculo()
gol.marca = "Volkswagen"
gol.ano = 2008
Atributo de classe ou de
instância?
• Um tema que costuma gerar dúvida é sobre atributos
de classe e de instância;
• Em Java e outras linguagens com tipagem estática e
suporte a classes, estes conceitos costumam se
misturar;
• Mas em Python estes conceitos são atômicos e o
entendimento de cada um é simples, por incrível que
pareça!
Atributo de classe ou de
instância?
• Um atributo de classe é um atributo definido na
classe;
• Um atributo de instância é um atributo definido na
instância da classe (objeto);
• Todo atributo de classe é refletido nas instâncias;
• Atributos de instâncias são únicos e pertencem apenas
à uma instância específica;
Atributo de classe ou de
instância?
class Veiculo(object):
pass

fusca = Veiculo()
fusca.marca = "Volkswagen"
fusca.ano = 1972

marca e ano são atributos de instância,


se criarmos outro objeto da classe
Veiculo estes atributos não existirão na
nova instância.
Prática
• Defina os seguintes atributos na classe Tamagoshi:
nome, fome, saude e idade.
Definindo métodos
• Um método é um atributo com comportamento;
• Para não fundir conceitos, vamos apenas trabalhar
com métodos da forma tradicional, ou quase isso;
• Para definir métodos e funções em Python utilizamos a
palavra reservada def;
Definindo métodos
class Veiculo(object):
marca = None
ano = None

def andar(self):
print("O carro esta andando!")

gol = Veiculo()
gol.marca = "Volkswagen"
gol.ano = 2008
gol.andar()

Aqui está nosso método andar!


Self?!?!
• Quando definimos nosso método, determinamos um
parâmetro, o self;
• Quando utilizamos o método, porém, não passamos
nenhum parâmetro!
• Quem é esse tal de self?
Self?!?!
class Veiculo {
public:
string* marca;
int ano;
void setAno(int ano);
};

#include "Veiculo.h"

void Veiculo::setAno(int ano){


this->ano = ano;
}

Quem é esse tal de this?


Self?!?!
public class Veiculo {
public String marca = null;
public Integer ano = null;

public void setAno(Integer ano){


this.ano = ano;
}
}

Quem é esse tal de this?


Prática
• Defina os seguintes métodos na classe Tamagoshi:
alterarNome, alterarFome, alterarSaude,
retornarNome, retornarFome e retornarSaude. Estes
métodos deverão acessar os atributos anteriormente
declarados;
• Defina o método retornarHumor, o humor não é um
atributo, mas sim a soma entre a fome e a saúde;
Métodos estáticos
• O conceito de método estático muitas vezes é confundido
com o conceito de função em linguagens como Java e
C#, que não suportam “métodos globais” (funções);
• O uso de métodos estáticos em Python é incomum, mas
existe;
• Para definir um método estático utilizamos a anotação
staticmethod;
Métodos estáticos
class Veiculo(object):
marca = None
ano = None

def __init__(self, marca = None, ano = None):


self.marca = marca
self.ano = ano
Por que não tem self?
def andar(self):
print("O carro esta andando!")

@staticmethod
def getDefaultInstance():
return Veiculo("", 0)
Prática
• Defina um método estático obterInstanciaPadrao na
classe Tamagoshi.
O que é um objeto?
• Antes de falarmos sobre instâncias, vamos pensar um
pouco: o que é um objeto?
O que é um objeto?
• Segundo Fernando Lozano, objeto é a representação de
uma coisa física, tangível, uma idéia ou um conceito.
Possui um estado (o que ele sabe) e um comportamento
(o que ele é capaz de fazer, como ele reage a estímulos
externos).
Importante saber!
1. A definição de objeto não é “um objeto é a instância de
uma classe”;
2. Objeto tem estado;
3. Objeto tem comportamento;
4. Objeto é a abstração de algo tangível;
5. Em Python, tudo é objeto.
Instanciando objetos
• Já vimos isso de forma “não oficial”;
• Agora veremos oficialmente a sintaxe para instanciar
objetos de uma classe!

Não tem new!

gol = Veiculo()
gol.marca = "Volkswagen"
gol.ano = 2008
gol.andar()
Instanciando objetos
• Quando instanciamos um objeto, acontecem
internamente algumas operações: alocação de memória;
definição de referência (ponteiro); etc.
• É comum a inicialização de atributos quando inicializamos
objetos;
• Em outras linguagens, temos a possibilidade de fazer a
implementação do construtor;
O que é um método
construtor?
O que é um método
construtor?
• É um método especial que constrói o objeto, ou seja, é o
método que retorna uma instância de determinada
classe;
• Em Python, o construtor chama-se __new__;
• Porém geralmente não se implementa o método
construtor em Python!
• O que é implementado é o método __init__. Este método
é chamado imediatamente após o construtor.
O que é um método
construtor?
class Veiculo(object):
marca = None
ano = None

def __init__(self, marca, ano):


self.marca = marca
self.ano = ano

def andar(self):
print("O carro esta andando!")
O que é um método
construtor?
gol = Veiculo.__new__(Veiculo, “Volkswagen”, 2008)
Veiculo.__init__(gol, “Volkswagen”, 2008)

gol = Veiculo(“Volkswagen”, 2008)


gol.marca = "Volkswagen"
gol.ano = 2008
gol.andar()
Peculiaridade: Argumentos
flexíveis
• Argumentos flexíveis, com valor default ou opcionais são
argumentos que podem ou não serem passados para um
método;
• Como Python não possui sobrecarga de métodos e
funções, o uso de argumentos flexíveis é extremamente
importante para trabalhar de forma similar;
• Definir um argumento flexível é fácil!
Peculiaridade: Argumentos
flexíveis

class Veiculo(object):
marca = None
ano = None

def __init__(self, marca = None, ano = None):


self.marca = marca
self.ano = ano

def andar(self):
print("O carro esta andando!")
Prática
• Defina um método inicializador na classe Tamagoshi.
Este método receberá valores de fome, saude e idade e
armazenará estes valores nos atributos internos
correspondentes;
• Utilize passagem flexível de parâmetros.
Herança de classes
• A herança permite criar um relacionamento entre classes
utilizando subclasses. Uma subclasse herda atributos e
métodos de sua superclasse.
• Utilizar herança pode poupar trabalho se métodos
puderem ser escritos uma vez em uma superclasse em
vez de muitas vezes em subclasses separadas.
Herança de classes
• Para definirmos herança de classes em Python,
utilizamos parênteses;
• Já utilizamos herança!
• Em Python, existem dois tipos de classe: new style e old
style;
• Classes new style são classes que sempre herdam de
alguma classe. Se você não herda de ninguém, você
deve herdar de object (de forma explícita);
• Este formato de classe passou a ser suportado pelo
Python apenas a partir da versão 2.2, quando a
linguagem tornou-se 100% orientada a objetos.
Herança de classes
• Vamos começar a
implementar o diagrama
ao lado!
Herança de classes
class Pessoa(object):
nome = None
idade = None

def __init__(self, nome, idade):


self.nome = nome
self.idade = idade

def envelhecer(self):
self.idade += 1
Herança de classes
• Para implementarmos a classe Atleta, precisaremos
chamar explicitamente o construtor da classe Pessoa
(superclasse);
• Existem duas formas de fazer isso em Python, veremos
apenas a forma mais correta! (:
Herança de classes
class Atleta(Pessoa):
peso = None
aposentado = None

def __init__(self, nome, idade, peso):


super(Atleta, self).__init__(nome, idade)
self.peso = peso
self.aposentado = False

def aquecer(self):
print("Atleta aquecido!")

def aposentar(self):
self.aposentado = True
Herança de classes
class Corredor(Atleta):
def correr(self):
print("Corredor correndo!")

class Nadador(Atleta):
def nadar(self):
print("Nadador nadando!")

class Ciclista(Atleta):
def pedalar(self):
print("Ciclista pedalando!")
Herança múltipla
• Há uma peculiaridade no diagrama de classes: a classe
TriAtleta herda de três outras classes;
• Muitas pessoas podem pensar: mas isso é impossível!
• Em Python, assim como em C++, isso é possível sim!
Logo, a classe TriAtleta fica bem simples:

class TriAtleta(Ciclista, Nadador, Corredor):


pass
MRO
• Um conceito fundamental ligado à herança múltipla é o
conceito de MRO (Method Resolution Order – Ordem de
resolução de métodos);
• Para descobrirmos a ordem de resolução de métodos de
uma classe, utilizamos a seguinte sintaxe:
Classe.__mro__.

print(TriAtleta.__mro__)
(<class '__main__.TriAtleta'>, <class
'__main__.Ciclista'>, <class
'__main__.Nadador'>, <class
'__main__.Corredor'>, <class
'__main__.Atleta'>, <class
'__main__.Pessoa'>, <type 'object'>)
Prática
• Implemente o diagrama de classes abaixo:
Polimorfismo
• Mesmo que Python não suporte sobrecarga de métodos
em uma mesma classe, é possível reimplementar
métodos em uma hierarquia de classes;
• Vamos reimplementar em todas as subclasses de Atleta o
método aquecer.
Polimorfismo
class Corredor(Atleta):
def correr(self):
print("Corredor correndo!")

def aquecer(self):
print("Corredor aquecido!")

class Nadador(Atleta):
def nadar(self):
print("Nadador nadando!")

def aquecer(self):
print("Nadador aquecido!")

class Ciclista(Atleta):
def pedalar(self):
print("Ciclista pedalando!")

def aquecer(self):
print("Ciclista aquecido!")
Encapsulamento
• Em Python, todos os atributos e métodos são públicos!
• Porém existe uma forma de dificultar o acesso aos
atributos e métodos, indicando que acessar aquele
atributo diretamente não é a operação aconselhada;
• Basta adicionar dois _ (underline) à frente dos atributos
e métodos;
• Podemos então definir métodos de acesso em nossas
classes;
Encapsulamento
Classe Pessoa
def retornarNome(self):
return self.__nome

def alterarNome(self, nome):


self.__nome = nome

def retornarIdade(self):
return self.__idade

def alterarIdade(self, idade):


self.__idade = idade
Encapsulamento

Classe Atleta
def retornarPeso(self):
return self.__peso

def alterarPeso(self, peso):


self.__peso = peso

def estaAposentado(self):
return self.__aposentado

def aposentar(self):
self.__aposentado = True
Encapsulamento Elegante:
Properties
• Ninguém aqui está programando em Java (:
• Java prega que você sempre deve acessar atributos
através de métodos;
• Python prega que você deve acessar atributos através de
métodos quando você precisa disso!
• Se não há necessidade de acessar um estado através de
um comportamento, por que fazer isso?
• Logo, todos os atributos são, por padrão, de acesso
irrestrito;
• Caso seja necessário restringir o acesso a estes
atributos, definimos os métodos de acesso e definimos
properties que acessarão estes métodos implicitamente!
Encapsulamento Elegante:
Properties
• Por exemplo: temos o atributo peso em Atleta e todas as
vezes que queremos configurar o valor de peso, deve ser
feita uma validação para que este peso não seja inferior
a 1 ou superior a 400;
• Implementamos então o método alterarPeso e
desenvolvemos nele a seguinte lógica:

def alterarPeso(self, peso):


if peso > 0 and peso < 400:
self.__peso = peso
Encapsulamento Elegante:
Properties

a = Atleta(“Maria”, 19, 50)


a.alterarPeso(25)
a.peso = 25

Coisa de Java!

Utilizando properties podemos configurar


para internamente o Python chamar
automaticamente o método alterarPeso
passando 25 como parâmetro.
Encapsulamento Elegante:
Properties
• Para fazer isso, precisamos de dois atributos!

__peso = None
peso = property(fget=retornarPeso, fset=alterarPeso)
Importante saber!
• Properties só funcionam em classes new style;
• Java também tem property! ;)
Prática
• Transforme todos os atributos da classe Tamagoshi em
properties.

Lembre-se: nem sempre você agirá assim. Encapsule


apenas o que tiver de ser encapsulado.
Exceções
Exceções
• Em Python, assim como em C++ e Java, o conceito de
Exceção está ligado à orientação a objetos.
• Uma exceção é um objeto, possui estado e
comportamento.
• O tratamento de exceções pode ser utilizado para
aumentar o nível de abstração do código.
• É possível usar exceções também para encapsular
dados específicos sobre o erro levantado.
• Vamos aprender como criar, tratar e levantar uma
exceção em Python!
Exceções
• Primeiramente, vamos criar nossas exceções.
• Uma exceção personalizada é modelada por uma
classe qualquer, que herda da classe BaseException;
• Nas versões anteriores de Python qualquer classe
podia modelar uma exceção. Isso gerava a má prática
de lançar exceções modeladas pela classe string;
Exceções
• Vamos definir nossa primeira exceção. Esta exceção
se chamará PesoError;

class PesoError(BaseException):
def __init__(self, mensagem = None):
if mensagem is not None:
self.message = mensagem
else:
self.message = "Erro no peso!"
Exceções
• Tudo bem Chico, criamos exceções! E como podemos
levantá-las?
• Para levantar uma exceção é muito simples! Basta
utilizar a palavra raise (levantar, em inglês).
• Vamos usar a exceção PesoError na classe Atleta, no
método alterarPeso;
• Se o peso informado for inválido, levantamos a
exceção!
Exceções

def alterarPeso(self, peso):


if peso > 0 and peso < 400:
self.__peso = peso
else:
raise PesoError("%f nao eh um peso valido!", %(peso))
Exceções
• Python levanta diversas exceções internamente:
ValueError, IOError, TypeError;
• Vamos tratar exceções!
• Para tratar exceções em Python utilizamos try…
except… else… finally;
Exceções
def lerIdade():
while True:
try:
idade = int(raw_input("Digite sua idade (apenas numeros inteiros): "))
except ValueError as e:
print("Digite apenas numeros inteiros!")
continue
else:
return idade

def lerPeso():
while True:
try:
peso = float(raw_input("Digite seu peso (apenas numeros reais): "))
except ValueError as e:
print("Digite apenas numeros reais, utilizando ponto para separar as
casas!")
else:
return peso
Exceções

if __name__ == "__main__":
print("CADASTRO DE ATLETAS", end="\n\n")
nome = raw_input("Digite seu nome (aperte enter para finalizar): ")
while nome != "":
idade = lerIdade()
peso = lerPeso()
try:
at = Atleta(nome, idade, peso)
except PesoError as e:
print(e.message)
nome = raw_input("Digite seu nome (aperte enter para finalizar): ")
Prática
• Analise as possíves exceções para a classe
Tamagoshi;
• Crie-as, lance-as e trate-as.
E agora?
• Leia a documentação;
• Descubra a sua vertente;
• Utilize Python na sua vertente!
Referências
• www.python.org
• www.pythonbrasil.org
• www.djangobrasil.org
• www.plone.org
• www.tchezope.org
Quanto tempo temos?
?
E-mail: franciscossouza@gmail.com

You might also like