minicurso de python
Post on 13-Jan-2015
9.436 Views
Preview:
DESCRIPTION
TRANSCRIPT
Conceitos Básicos, Estruturas de Dados e Orientação a objetos
Minicurso de Python
Francisco A. S. Souza
I Jornada Acadêmica de Ciência, Tecnologia e Cultura
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?
• C++:
void Faladora::dizerOi(string* nome){
cout << “Olá” << nome->c_str() << “!” << endl;
}
int main(void) {
Faladora* falador = new Faladora();
falador->dizerOi(new string(“Francisco”));
}
class Faladora {public:
void dizerOi(string* nome);};
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?
Sintaxeif 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
n1 = "10"
n2 = 19
soma = n1 + n2
Qual o tipo de n1?
Qual o tipo de n2?
O que acontece aqui?
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()
Assim funciona, mas você não precisa disso! ;)
A função raw_input sempre retorna uma string.
A função input “adivinha” o tipo digitado e retorna. CUIDADO!
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",
print("Pulei linha")
print("Não pulei linha", end="")
Python 2.xPython 3.0
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")
for linha in arquivo: print(linha)
for linha in arquivo: linha = linha.replace("\n", "") palavras = linha.split('\t') for palavra in palavras: print(palavra)
Abrindo o arquivo para leitura Imprimindo uma linha do arquivo a cada duas
linhas da tela.
Imprimindo uma palavra por linha
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)
z : z pertence a lista e z for ímpar.
Matemática
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
tupla = ("Teste 1", "Teste 2")tupla[0] = "Teste 3"tupla.append("Teste 4")
TypeError: 'tuple' object does not support item assignment
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:
maior = n1
else:
maior = n2
while i < 5:
i += 1
numeros = [21, 5, 10]
for numero in numeros:
print(numero)
Blocos de código definidos por endentação!
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.
(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 para definir classes! (:
Palavra reservada pass, siginifica: 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 = 2008gol.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?
#include "Veiculo.h"
void Veiculo::setAno(int ano){ this->ano = ano;}
Self?!?!
Quem é esse tal de this?
class Veiculo { public: string* marca; int ano; void setAno(int ano);};
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
def andar(self): print("O carro esta andando!")
@staticmethod def getDefaultInstance(): return Veiculo("", 0)
Por que não tem self?
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!
gol = Veiculo()gol.marca = "Volkswagen"gol.ano = 2008gol.andar()
Não tem new!
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(“Volkswagen”, 2008)gol.marca = "Volkswagen"gol.ano = 2008gol.andar()
gol = Veiculo.__new__(Veiculo, “Volkswagen”, 2008)
Veiculo.__init__(gol, “Volkswagen”, 2008)
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 classesclass 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 classesclass Corredor(Atleta): def correr(self): print("Corredor correndo!")
class Ciclista(Atleta): def pedalar(self): print("Ciclista pedalando!")
class Nadador(Atleta): def nadar(self): print("Nadador nadando!")
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.
Polimorfismoclass 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
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
Classe Pessoa
Encapsulamento
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
Classe Atleta
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 = Nonepeso = 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çõesdef 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
top related