Você está na página 1de 127

Minicurso de Python

Conceitos Bsicos, Estruturas de Dados e Orientao a objetos


Francisco A. S. Souza

O que Python?
Python uma linguagem de programao de altssimo nvel (VHLPL very high level programming language), interpretada, orientada a objetos, de tipagem forte e dinmica 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 importncia do esforo do programador sobre o esforo computacional. Prioriza a legibilidade do cdigo 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 tambm em Python. Zope, um dos melhores servidores de aplicao da atualidade foi desenvolvido em Python.

Quem usa Python?


Plone, que uma aplicao do Zope, foi desenvolvido em Python e utilizado largamente em diversos web sites: Governo Brasileiro, Portal da Cmara dos Deputados, CEFET-Campos, PyCon Brasil, Novell, Free Software Foundation, etc. Diversas empresas que fabricam distribuies Linux utilizam softwares personalizados feitos em Python: Novell (SuSE e Open SuSE), Canonical (Ubuntu), Red Hat, dentre outras. A Microsoft tambm 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 portvel, voc no precisa compilar seu programa cada vez que muda de sistema operacional, basta apenas que exista um interpretador Python instalado. Python open-source com licena flexvel, h uma comunidade que desenvolve a linguagem, que est sempre aprimorando-a e qualquer um de ns pode fazer parte dessa comunidade. A licena flexvel nos permite desenvolver softwares proprietrios com ferramentas livres.

Por que usar Python?


Python simples e auto-descritiva, algumas linguagens de programao tm sintaxe complexa ou difcil de memorizar. Vejamos alguns exemplos de cdigo para declarar uma classe (Faladora) que tem o mtodo pblico 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 mtodo.

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?


C++:
class Faladora { 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 presena de um interpretador interativo (assim como Ruby) tambm 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. possvel que no funcione desta forma, pois o Python pode no estar configurado no PATH do Windows, neste caso necessrio achar o diretrio de instalao 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 distribuies Linux que trazem interface grfica hoje vm com o Python instalado, j que diversos softwares para este sistema operacional so feitos em Python. Desta forma, geralmente no necessrio instalar o Python em distribuies Linux.

Utilizando o interpretador

Utilizando o interpretador

Utilizando o interpretador
Alguns comandos bsicos do interpretador: help() import this E o nosso primeiro comando conhecido em Python: print(Ol mundo!)

Resumo de caractersticas
Case sensitive; Tipagem dinmica e forte; Linguagem pura: 100% orientada a objetos; Cdigo auto-descritivo: simples e de fcil leitura; Programao em alto-nvel: no permite manipulao de ponteiros; No suporta sobrecarga de funes; 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! No preciso saber programao para entender este cdigo, basta um conhecimento bsico em ingls!

Variveis
O conceito de varivel em Python representado sempre por um objeto. Na verdade, Python uma linguagem pura, ou seja, tudo em Python um objeto. Toda varivel uma referncia! Variveis armazenam endereos de memria e no valores!

Variveis
Python possui tipagem dinmica e forte; Tipagem dinmica significa que a varivel assume o tipo de acordo com o valor atribudo; Tipagem forte significa que se uma varivel do tipo inteiro, ela deve ser tratada como um inteiro, ou convertida para ser tratada de outra forma; Para mudar o tipo de uma varivel, devemos declarla novamente;

Variveis
Qual o tipo de n1?

n1 = "10" n2 = 19

Qual o tipo de n2?

soma = n1 + n2

O que acontece aqui?

Lendo do Teclado
Em Python, a leitura de dados do teclado feita atravs das funes raw_input e input.

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

A funo input adivinha o tipo digitado e retorna. CUIDADO! A funo raw_input sempre retorna uma string. Assim funciona, mas voc no precisa disso! ;)

Escrevendo na Tela
Para escrita na tela, utilizamos o comando print. Vale lembrar que o print no uma funo (passar a ser na verso 3.0 do Python). Porm, utilizaremos o print do futuro! Utilizaremos o print como funo.

Escrevendo na Tela

print "Pulei linha" print "No pulei linha",


Python 2.x Python 3.0

print("Pulei linha") print("No pulei linha", end="")

Lendo e Escrevendo em Arquivos


Leitura de arquivos em Python simples como em C! Arquivos so objetos do tipo file; Para a abertura de um arquivo, utilizamos a funo open; A funo open funciona como uma fbrica de instncias.

Lendo e Escrevendo em Arquivos


Abrindo o arquivo para leitura

arquivo = open("entrada.txt")
Imprimindo uma linha do arquivo a cada duas linhas da tela. Imprimindo uma palavra por linha

for linha in arquivo: print(linha)

for linha in arquivo: linha = linha.replace("\n", "") palavras = linha.split('\t') for palavra in palavras: print(palavra)

Operadores
Os operadores do Python:
Aritmticos + * / Comparao == != > < >= <= in is Lgicos and or not

Mdulos
Mdulo o agrupamento de comandos para o operador. Numa definio mais informal, mdulo um arquivo de cdigo-fonte Python. Mdulos so arquivos definidos com as extenses .py, .pyc, .pyo, .pyw, dentre outras menos utilizadas. Nossos mdulos tero sempre a extenso .py, pois se trata da extenso para cdigo fonte de execuo em terminal. Em Python possvel definir mais de uma classe por arquivo (mdulo).

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 mtodos 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 maisculo. upper(): Retorna a mesma string com todas as letras em maisculo. lower(): Retorna a mesma string com todas as letras em minsculo.

Strings
Mais mtodos: replace(antigo, novo): Retorna a mesma string com o valor novo em todas as ocorrncias de antigo. split([separador]): Retorna uma lista de strings. Caso o separador no seja especificado, a lista ser dividida por espaos 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 so vetores e matrizes. Dentre as mais avanadas, a mais conhecida a lista. H ainda outras estruturas como rvore, pilha, fila, hash, etc. Vale lembrar que uma string tambm uma estrutura de dados! Estudaremos trs 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 espcie de mistura entre o comportamento de vetores (acesso rpido por ndices) e listas (iterabilidade); Aviso aos programadores PHP: Em Python no permitido adicionar novos elementos em uma lista criando um ndice, necessrio utilizar o mtodo append() para adicionar um novo elemento!

Estruturas de Dados: List


Antes de por a mo 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 mtodos 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 funes que todos aprendem em Python a funo 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 avanada de gerar listas a partir de outras listas; Trata-se da tcnica List Comprehension (Compreenso de Listas); A sintaxe de List Comprehension vem da linguagem funcional Haskell; O nome e a sintaxe originam da Matemtica: Compreenso de listas tem sintaxe praticamente igual notao axiomtica de compreenso (Teoria de Conjuntos);

Gerando Listas
Supondo que seu amado professor de algoritmos lhe passou o seguinte exerccio: Elabore um algoritmo que leia um nmero 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
No 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)


Matemtica

z : z pertence a lista e z for mpar.

Estruturas de Dados: Tuple


Tuplas so como as listas, a diferena que tuplas so estruturas de dados imutveis. Pode-se dizer que, em Python, uma string uma tupla de caracteres. Vamos a um exemplo para melhor compreenso. Veremos primeiro o que no possvel 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, tambm 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 dicionrios, para facilitar a fala em portugus; Um dicionrio uma estrutura de dados onde cada n composto por uma chave e um valor; Tm este nome pois so praticamente a mesma coisa que um dicionrio!

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 mtodos de manipulao de dicionrios: 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 dicionrio. keys(): retorna uma lista com todas as chaves do dicionrio. clear(): remove todos os itens do dicionrio.

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: n1 maior = while i < 5: i += 1

else: n2 maior =
Blocos de cdigo definidos por endentao!

numeros = [21, 5, 10]


O for do Python funciona como o foreach do PHP e do Fortran 90, ou o enhanced for do Java, ou seja, percorrida uma estrutura de dados, pegando elemento por elemento da estrutura.

for numero in numeros: print(numero)

(Blocos de cdigo)
Como todos j perceberam, em Python no utilizamos caracteres ou palavras para delimitar blocos de cdigo. Em C e linguagens derivadas, utilizamos o {}, em Pascal utilizamos begin .. end. Em Python, o que determina o incio e o fim de um bloco endentao.

Prtica
Faa um algoritmo que leia um nmero x e imprima a soma de todos os mpares entre 1 e x; Desafio: faa o algoritmo acima sem usar controle de fluxo.

Orientao a Objetos em Python

Orientao a objetos
Python uma linguagem 100% orientada a objetos, significa que tudo em Python um objeto! Veremos nos prximos slides como definir classes, atributos, mtodos e como aplicar em Python diversos conceitos da Orientao a Objetos.

Definindo Classes
class Veiculo(object): pass

Palavra class tipicamente utilizada para definir classes! (:

Palavra reservada pass, siginifica: passe este bloco.

Prtica
Defina a classe vazia Tamagoshi.

Definindo Atributos
Existem duas formas de definir atributos de instncia 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 instncia?


Um tema que costuma gerar dvida sobre atributos de classe e de instncia; Em Java e outras linguagens com tipagem esttica e suporte a classes, estes conceitos costumam se misturar; Mas em Python estes conceitos so atmicos e o entendimento de cada um simples, por incrvel que parea!

Atributo de classe ou de instncia?


Um atributo de classe um atributo definido na classe; Um atributo de instncia um atributo definido na instncia da classe (objeto); Todo atributo de classe refletido nas instncias; Atributos de instncias so nicos e pertencem apenas uma instncia especfica;

Atributo de classe ou de instncia?


class Veiculo(object): pass fusca = Veiculo() fusca.marca = "Volkswagen" fusca.ano = 1972

marca e ano so atributos de instncia, se criarmos outro objeto da classe Veiculo estes atributos no existiro na nova instncia.

Prtica
Defina os seguintes atributos na classe Tamagoshi: nome, fome, saude e idade.

Definindo mtodos
Um mtodo um atributo com comportamento; Para no fundir conceitos, vamos apenas trabalhar com mtodos da forma tradicional, ou quase isso; Para definir mtodos e funes em Python utilizamos a palavra reservada def;

Definindo mtodos
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 mtodo andar!

Self?!?!
Quando definimos nosso mtodo, determinamos um parmetro, o self; Quando utilizamos o mtodo, porm, no passamos nenhum parmetro! 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?

Prtica
Defina os seguintes mtodos na classe Tamagoshi: alterarNome, alterarFome, alterarSaude, retornarNome, retornarFome e retornarSaude. Estes mtodos devero acessar os atributos anteriormente declarados; Defina o mtodo retornarHumor, o humor no um atributo, mas sim a soma entre a fome e a sade;

Mtodos estticos
O conceito de mtodo esttico muitas vezes confundido com o conceito de funo em linguagens como Java e C#, que no suportam mtodos globais (funes); O uso de mtodos estticos em Python incomum, mas existe; Para definir um mtodo esttico utilizamos a anotao staticmethod;

Mtodos estticos
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!") @staticmethod def getDefaultInstance(): return Veiculo("", 0) Por que no tem self?

Prtica
Defina um mtodo esttico obterInstanciaPadrao na classe Tamagoshi.

O que um objeto?
Antes de falarmos sobre instncias, vamos pensar um pouco: o que um objeto?

O que um objeto?
Segundo Fernando Lozano, objeto a representao de uma coisa fsica, tangvel, uma idia ou um conceito. Possui um estado (o que ele sabe) e um comportamento (o que ele capaz de fazer, como ele reage a estmulos externos).

Importante saber!
1. 2. 3. 4. 5. A definio de objeto no um objeto a instncia de uma classe; Objeto tem estado; Objeto tem comportamento; Objeto a abstrao de algo tangvel; Em Python, tudo objeto.

Instanciando objetos
J vimos isso de forma no oficial; Agora veremos oficialmente a sintaxe para instanciar objetos de uma classe!
No tem new!

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

Instanciando objetos
Quando instanciamos um objeto, acontecem internamente algumas operaes: alocao de memria; definio de referncia (ponteiro); etc. comum a inicializao de atributos quando inicializamos objetos; Em outras linguagens, temos a possibilidade de fazer a implementao do construtor;

O que um mtodo construtor?

O que um mtodo construtor?


um mtodo especial que constri o objeto, ou seja, o mtodo que retorna uma instncia de determinada classe; Em Python, o construtor chama-se __new__; Porm geralmente no se implementa o mtodo construtor em Python! O que implementado o mtodo __init__. Este mtodo chamado imediatamente aps o construtor.

O que um mtodo 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 mtodo 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 flexveis


Argumentos flexveis, com valor default ou opcionais so argumentos que podem ou no serem passados para um mtodo; Como Python no possui sobrecarga de mtodos e funes, o uso de argumentos flexveis extremamente importante para trabalhar de forma similar; Definir um argumento flexvel fcil!

Peculiaridade: Argumentos flexveis

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!")

Prtica
Defina um mtodo inicializador na classe Tamagoshi. Este mtodo receber valores de fome, saude e idade e armazenar estes valores nos atributos internos correspondentes; Utilize passagem flexvel de parmetros.

Herana de classes
A herana permite criar um relacionamento entre classes utilizando subclasses. Uma subclasse herda atributos e mtodos de sua superclasse. Utilizar herana pode poupar trabalho se mtodos puderem ser escritos uma vez em uma superclasse em vez de muitas vezes em subclasses separadas.

Herana de classes
Para definirmos herana de classes em Python, utilizamos parnteses; J utilizamos herana! Em Python, existem dois tipos de classe: new style e old style; Classes new style so classes que sempre herdam de alguma classe. Se voc no herda de ningum, voc deve herdar de object (de forma explcita); Este formato de classe passou a ser suportado pelo Python apenas a partir da verso 2.2, quando a linguagem tornou-se 100% orientada a objetos.

Herana de classes
Vamos comear a implementar o diagrama ao lado!

Herana 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

Herana 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! (:

Herana 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

Herana 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!")

Herana mltipla
H uma peculiaridade no diagrama de classes: a classe TriAtleta herda de trs outras classes; Muitas pessoas podem pensar: mas isso impossvel! Em Python, assim como em C++, isso possvel sim! Logo, a classe TriAtleta fica bem simples:

class TriAtleta(Ciclista, Nadador, Corredor): pass

MRO
Um conceito fundamental ligado herana mltipla o conceito de MRO (Method Resolution Order Ordem de resoluo de mtodos); Para descobrirmos a ordem de resoluo de mtodos 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'>)

Prtica
Implemente o diagrama de classes abaixo:

Polimorfismo
Mesmo que Python no suporte sobrecarga de mtodos em uma mesma classe, possvel reimplementar mtodos em uma hierarquia de classes; Vamos reimplementar em todas as subclasses de Atleta o mtodo 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 mtodos so pblicos! Porm existe uma forma de dificultar o acesso aos atributos e mtodos, indicando que acessar aquele atributo diretamente no a operao aconselhada; Basta adicionar dois _ (underline) frente dos atributos e mtodos; Podemos ento definir mtodos de acesso em nossas classes;

Encapsulamento
def retornarNome(self): return self.__nome
Classe Pessoa

def alterarNome(self, nome): self.__nome = nome def retornarIdade(self): return self.__idade def alterarIdade(self, idade): self.__idade = idade

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

def alterarPeso(self, peso): self.__peso = peso def estaAposentado(self): return self.__aposentado def aposentar(self): self.__aposentado = True

Encapsulamento Elegante: Properties


Ningum aqui est programando em Java (: Java prega que voc sempre deve acessar atributos atravs de mtodos; Python prega que voc deve acessar atributos atravs de mtodos quando voc precisa disso! Se no h necessidade de acessar um estado atravs de um comportamento, por que fazer isso? Logo, todos os atributos so, por padro, de acesso irrestrito; Caso seja necessrio restringir o acesso a estes atributos, definimos os mtodos de acesso e definimos properties que acessaro estes mtodos 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 validao para que este peso no seja inferior a 1 ou superior a 400; Implementamos ento o mtodo alterarPeso e desenvolvemos nele a seguinte lgica:
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 mtodo alterarPeso passando 25 como parmetro.

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 tambm tem property! ;)

Prtica
Transforme todos os atributos da classe Tamagoshi em properties.

Lembre-se: nem sempre voc agir assim. Encapsule apenas o que tiver de ser encapsulado.

Excees

Excees
Em Python, assim como em C++ e Java, o conceito de Exceo est ligado orientao a objetos. Uma exceo um objeto, possui estado e comportamento. O tratamento de excees pode ser utilizado para aumentar o nvel de abstrao do cdigo. possvel usar excees tambm para encapsular dados especficos sobre o erro levantado. Vamos aprender como criar, tratar e levantar uma exceo em Python!

Excees
Primeiramente, vamos criar nossas excees. Uma exceo personalizada modelada por uma classe qualquer, que herda da classe BaseException; Nas verses anteriores de Python qualquer classe podia modelar uma exceo. Isso gerava a m prtica de lanar excees modeladas pela classe string;

Excees
Vamos definir nossa primeira exceo. Esta exceo 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!"

Excees
Tudo bem Chico, criamos excees! E como podemos levant-las? Para levantar uma exceo muito simples! Basta utilizar a palavra raise (levantar, em ingls). Vamos usar a exceo PesoError na classe Atleta, no mtodo alterarPeso; Se o peso informado for invlido, levantamos a exceo!

Excees
def alterarPeso(self, peso): if peso > 0 and peso < 400: self.__peso = peso else: raise PesoError("%f nao eh um peso valido!", %(peso))

Excees
Python levanta diversas excees internamente: ValueError, IOError, TypeError; Vamos tratar excees! Para tratar excees em Python utilizamos try except else finally;

Excees
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

Excees
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): ")

Prtica
Analise as possves excees para a classe Tamagoshi; Crie-as, lance-as e trate-as.

E agora?
Leia a documentao; Descubra a sua vertente; Utilize Python na sua vertente!

Referncias
www.python.org www.pythonbrasil.org www.pythonrio.org www.pythoncampus.org www.djangobrasil.org www.plone.org www.tchezope.org

Você também pode gostar