129
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

Minicurso de Python

Embed Size (px)

DESCRIPTION

Minicurso de Python apresentado durante a I Jornada Acadêmica de Ciência, Tecnologia e Cultura do Centro Federal de Educação Tecnológica do Espírito Santo.

Citation preview

Page 1: Minicurso de Python

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

Page 2: Minicurso de Python

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

Page 3: Minicurso de Python

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

Page 4: Minicurso de Python

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.

Page 5: Minicurso de Python

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.

Page 6: Minicurso de 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.

Page 7: Minicurso de 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

Page 8: Minicurso de Python

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.

Page 9: Minicurso de Python

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.

Page 10: Minicurso de Python

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.

Page 11: Minicurso de Python

Por que usar Python?

• PHP:

<?php

class Faladora {

public function dizerOi($nome){

echo "Olá $nome! <br />";

}

}

$falador = new Faladora();

$falador->dizerOi(“Francisco”);

?>

Page 12: Minicurso de Python

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);};

Page 13: Minicurso de Python

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”);

}

}

Page 14: Minicurso de Python

Por que usar Python?

• Python:

class Faladora:

def dizerOi(self, nome):

print("Olá %s!") %(nome)

falador = Faladora()

falador.dizerOi(“Francisco")

Page 15: Minicurso de Python

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?

Page 16: Minicurso de Python

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.

Page 17: Minicurso de Python

Utilizando o interpretador

Page 18: Minicurso de Python

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.

Page 19: Minicurso de Python

Utilizando o interpretador

Page 20: Minicurso de Python

Utilizando o interpretador

Page 21: Minicurso de Python

Utilizando o interpretador

• Alguns comandos básicos do interpretador:

help()

import this

• E o nosso primeiro comando conhecido em Python:

print(“Olá mundo!”)

Page 22: Minicurso de Python

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. :)

Page 23: Minicurso de Python

Achou o interpretador feio?

Page 24: Minicurso de Python

Achou o interpretador feio?

Page 25: Minicurso de Python

Achou o interpretador feio?

Page 26: Minicurso de Python

Achou o interpretador feio?

Page 27: Minicurso de Python

Achou o interpretador feio?

Page 28: Minicurso de Python

Achou o interpretador feio?

Page 29: Minicurso de Python

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!

Page 30: Minicurso de Python

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!

Page 31: Minicurso de Python

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;

Page 32: Minicurso de Python

Variáveis

n1 = "10"

n2 = 19

soma = n1 + n2

Qual o tipo de n1?

Qual o tipo de n2?

O que acontece aqui?

Page 33: Minicurso de Python

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!

Page 34: Minicurso de Python

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.

Page 35: Minicurso de Python

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

Page 36: Minicurso de Python

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.

Page 37: Minicurso de Python

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

Page 38: Minicurso de Python

Operadores

• Os operadores do Python:

Aritméticos Comparação Lógicos

+ == and

- != or

* > not

/ <

>=

<=

in

is

Page 39: Minicurso de Python

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

Page 40: Minicurso de Python

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.

Page 41: Minicurso de Python

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.

Page 42: Minicurso de Python

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.

Page 43: Minicurso de Python

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

Page 44: Minicurso de Python

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.

Page 45: Minicurso de Python

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!

Page 46: Minicurso de Python

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

Page 47: Minicurso de Python

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

Page 48: Minicurso de Python

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.

Page 49: Minicurso de Python

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)

Page 50: Minicurso de Python

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;

Page 51: Minicurso de Python

Gerando Listas

lista1 = range(1500)

lista2 = range(1001, 2000)

Gera uma lista de 0 até 1499.

Gera uma lista de 1001 até 1999.

Page 52: Minicurso de Python

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

Page 53: Minicurso de Python

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)

Page 54: Minicurso de Python

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

Page 55: Minicurso de Python

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.

Page 56: Minicurso de Python

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'

Page 57: Minicurso de Python

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

Page 58: Minicurso de Python

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!

Page 59: Minicurso de Python

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"}

Page 60: Minicurso de Python

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.

Page 61: Minicurso de Python

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)

Page 62: Minicurso de Python

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.

Page 63: Minicurso de Python

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

Page 64: Minicurso de Python

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.

Page 65: Minicurso de Python

Orientação a Objetos em Python

Page 66: Minicurso de 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.

Page 67: Minicurso de Python

Definindo Classes

class Veiculo(object): pass

Palavra class tipicamente utilizada para definir classes! (:

Palavra reservada pass, siginifica: passe este bloco.

Page 68: Minicurso de Python

Prática

• Defina a classe vazia “Tamagoshi”.

Page 69: Minicurso de Python

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

Page 70: Minicurso de Python

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!

Page 71: Minicurso de Python

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;

Page 72: Minicurso de Python

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.

Page 73: Minicurso de Python

Prática

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

Page 74: Minicurso de Python

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;

Page 75: Minicurso de Python

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!

Page 76: Minicurso de Python

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?

Page 77: Minicurso de Python

#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);};

Page 78: Minicurso de Python

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?

Page 79: Minicurso de Python

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;

Page 80: Minicurso de Python

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;

Page 81: Minicurso de Python

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?

Page 82: Minicurso de Python

Prática

• Defina um método estático obterInstanciaPadrao na classe Tamagoshi.

Page 83: Minicurso de Python

O que é um objeto?

• Antes de falarmos sobre instâncias, vamos pensar um pouco: o que é um objeto?

Page 84: Minicurso de Python

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

Page 85: Minicurso de Python

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.

Page 86: Minicurso de Python

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!

Page 87: Minicurso de Python

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;

Page 88: Minicurso de Python

O que é um método construtor?

Page 89: Minicurso de Python

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.

Page 90: Minicurso de Python

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

Page 91: Minicurso de Python

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)

Page 92: Minicurso de Python

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!

Page 93: Minicurso de Python

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

Page 94: Minicurso de Python

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.

Page 95: Minicurso de Python

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.

Page 96: Minicurso de Python

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.

Page 97: Minicurso de Python

Herança de classes

• Vamos começar a implementar o diagrama ao lado!

Page 98: Minicurso de Python

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

Page 99: Minicurso de Python

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

Page 100: Minicurso de Python

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

Page 101: Minicurso de Python

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

Page 102: Minicurso de Python

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

Page 103: Minicurso de Python

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

Page 104: Minicurso de Python

Prática

• Implemente o diagrama de classes abaixo:

Page 105: Minicurso de Python

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.

Page 106: Minicurso de Python

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

Page 107: Minicurso de Python

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;

Page 108: Minicurso de Python

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

Page 109: Minicurso de Python

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

Page 110: Minicurso de Python

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!

Page 111: Minicurso de Python

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

Page 112: Minicurso de Python

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.

Page 113: Minicurso de Python

Encapsulamento Elegante: Properties

• Para fazer isso, precisamos de dois atributos!

__peso = Nonepeso = property(fget=retornarPeso, fset=alterarPeso)

Page 114: Minicurso de Python

Importante saber!

• Properties só funcionam em classes new style;

• Java também tem property! ;)

Page 115: Minicurso de Python

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.

Page 116: Minicurso de Python

Exceções

Page 117: Minicurso de Python

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!

Page 118: Minicurso de 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;

Page 119: Minicurso de Python

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

Page 120: Minicurso de Python

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!

Page 121: Minicurso de Python

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

Page 122: Minicurso de Python

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;

Page 123: Minicurso de Python

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

Page 124: Minicurso de Python

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

Page 125: Minicurso de Python

Prática

• Analise as possíves exceções para a classe Tamagoshi;

• Crie-as, lance-as e trate-as.

Page 126: Minicurso de Python

E agora?

• Leia a documentação;

• Descubra a sua vertente;

• Utilize Python na sua vertente!

Page 127: Minicurso de Python

Referências

• www.python.org

• www.pythonbrasil.org

• www.djangobrasil.org

• www.plone.org

• www.tchezope.org

Page 128: Minicurso de Python

Quanto tempo temos?

Page 129: Minicurso de Python

?E-mail: [email protected]