Luciano Ramalho dezembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Documentos relacionados
Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Descritores de atributos em Python

Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Produtividade e qualidade em Python através da metaprogramação

Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Python para quem sabe Python

Python para quem sabe Python

Curso de Python em 5 Horas

Python: Exceções, Iteradores e Geradores. Claudio Esperança

1 Definição de funções 1. 2 Valores boleanos e condicionais 5. Podemos depois usar as novas funções tal qual as pré-definidas

Programação procedimental

Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

Python. Resumo e Exercícios P3

TCC 00308: Programação de Computadores I Organização de programas em Python

Listas, conjuntos e dicionários

Organização de programas em Python. Vanessa Braganholo

Aula de hoje. Expressões. Expressões. Expressões. Exemplos. Programa em Python. SCC Introdução à Programação para Engenharias

Computação 2. Aula 7 Teórica professor: Leonardo Carvalho

Laboratório de Programação 1 Aula 04

Computação 1 - Python Aula 10 - Teórica: Estrutura de Dados - Dicionário. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 18

Algoritmos e estrutura de dados

Entrada e saída. Marco A L Barbosa malbarbo.pro.br. Departamento de Informática Universidade Estadual de Maringá

Os elementos da programação

Nesta aula... Diagramas da stack. Recursão. 1 Funções. 2 Valores booleanos e condicionais. 3 Execução condicional e recursão

Computação II (MAB 225)

MAC2166 Introdução à Computação

Fundamentos da Programação

Funções. Prof. Alberto Costa Neto Programação em Python

Padrão para a codificação em Python

MC-102 Aula 11 Strings

1/ 26. Computação 1 - Python Aula 1 - Prática: Primeiros Passos - Função

Computação I - Python Aula 4 - Teórica: Variáveis e Atribuição, Strings

Preparação para Maratona de Informática PYTHON

Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2003/2004

Computação I - Python Aula 1 - Prática: Primeiros Passos- Função

Dicionários. Prof. Alberto Costa Neto Programação em Python

Aula passada. Aula passada... Sequências Funções puras e modificadores. Listas Tuplos

Python: Classes. Claudio Esperança

Computação II (MAB 225)

Orientação a Objetos parte 2 ENCAPSULAMENTO, CLASSES, HERANÇAS

Computação 1 - Python Aula 4 - Teórica Variáveis e Atribuição, Strings. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 30

Introdução à Programação / Programação I

Aplicações de Dicionários. Prof. Alberto Costa Neto Programação em Python

Python: Listas. Claudio Esperança

Programação I Aula 17 Correção de programas Pedro Vasconcelos DCC/FCUP

MAC2166 Introdução à Computação

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Algoritmos e estrutura de dados

Introdução à Programação / Programação I

Computação 1 - Python Aula 6 - Teórica: Listas 1/ 28

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Programação de Computadores

Programação de Computadores

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

PROGRAMAÇÃO E PYTHON. Laboratórios de Informática João Paulo Barraca, André Zúquete, Diogo Gomes

Orientação a Objetos com Ruby

Programação I Aula 19 Aritmética com racionais Pedro Vasconcelos DCC/FCUP

Listas e Tuplas. Vanessa Braganholo

Informática Aplicada à Engenharia Florestal

Introdução à Programação Aula 17 Deteção e correção de erros

Computação 2. Aula 11 Teórica professor: Leonardo Carvalho

Prof. Natalia Castro Fernandes Mestrado em Telecomunicações UFF 2º semestre/2012

Linguagem de Programação IV Introdução

Linguagem de Programação III

1/ 23. Computação 1 - Python Aula 1 - Prática: Primeiros Passos - Função

MCG114 Programação de Computadores I. Strings. Strings. Strings. Strings. Strings 3/26/18. Profa. Janaína Gomide

Classes e Objetos. Sintaxe de classe em Java

Programação I Aula 8 Cadeias de carateres

Osvaldo Santana Thiago Galesi

Computação 1 - Python Aula 4 - Teórica: Variáveis e Atribuição, Strings 1/ 26

Trabalhando com Arquivos

Prof. Natalia Castro Fernandes Mestrado em Telecomunicações UFF 2º semestre/2012

Python 3.x Estrutura de Repetição while

Programação I Aula 13 Manipulação de ficheiros

Abaixo iremos pormenorizar cada um de seus atributos:

INTRODUÇÃO À COMPUTAÇÃO - RESUMO E EXERCÍCIOS* P2

Departamento de Ciência da Computação Python 3.x Tipo de Dados String. Introdução à Ciência da Computação. Prof. Edison Ishikawa

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Python 3.x Estrutura de Repetição for Estrutura de Decisão if then else

Aula de hoje. Tipos de Dados e Variáveis. Constantes literais. Dados. Variáveis. Tipagem dinâmica. SCC Introdução à Programação para Engenharias

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Programação orientada a objetos

Orientação a Objetos e Java

Comandos de Entrada e Saída. Prof. Alberto Costa Neto Programação em Python

SCC0124 Introdução à Programação para Engenharias

DURAÇÃO DA PROVA: 2 horas

A Linguagem Python: Uma visão geral. Prof. Alberto Costa Neto Programação em Python

Introdução à Programação Aula 13 Manipulação de ficheiros

} Instalando o Ruby. } Conceitos básicos do Ruby. } Métodos. } Classes. } Módulos. } Arrays e Hashes. } Estruturas de Controle. } Expressões regulares

PRIMEIROS PASSOS COM PYTHON. Prof. Msc. Luis Filipe Alves Pereira 2015

Vetores. Vanessa Braganholo

Interação com o usuário

Luciano Iteráveis, geradores & cia: o caminho pythonico

Programação de Computadores

Computação I - Python

Introdução à Ciência da Computação Disciplina:

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Módulos. from <nome do modulo> import <nome objecto> Módulos

Transcrição:

Luciano Ramalho luciano@ramalho.org dezembro/2012 Objetos Pythonicos Orientação a objetos e padrões de projeto em Python

Exemplo prático com funções geradoras Funções geradoras para desacoplar laços de leitura e escrita em uma ferramenta para conversão de bases de dados semi-estruturadas https://github.com/ramalho/isis2json @ramalhoorg

Exemplo: funções geradoras @ramalhoorg

Laço principal escreve arquivo JSON @ramalhoorg

Um outro laço lê os registros a converter @ramalhoorg

Implementação possível: o mesmo laço lê e grava @ramalhoorg

Mas e a lógica para ler outro formato? @ramalhoorg

Funções do script itermstrecords* iterisorecords* writejsonarray main * funções geradoras @ramalhoorg

Função main: leitura dos argumentos @ramalhoorg

Função main: seleção do formato de entrada escolha da função geradora de leitura depende do formato de entrada função geradora escolhida é passada como argumento @ramalhoorg

writejsonarray: escrever registros em JSON @ramalhoorg

writejsonarray: itera sobre umas das funções geradoras @ramalhoorg

iterisorecords: ler registros função geradora! de arquivo ISO-2709 @ramalhoorg

iterisorecords cria um novo dict a cada iteração produz (yield) registro na forma de um dict @ramalhoorg

itermstrecords: função geradora! ler registros de arquivo ISIS.MST @ramalhoorg

iterisorecords itermstrecords cria um novo dict a cada iteração produz (yield) registro na forma de um dict @ramalhoorg

Geradores na prática @ramalhoorg

Geradores na prática @ramalhoorg

Geradores na prática @ramalhoorg

Encapsulamento

Encapsulamento Propriedades: encapsulamento para quem precisa de encapsulamento >>> a = C() >>> a.x = 10 >>> print a.x 10 >>> a.x = -10 >>> print a.x 0 violação de encapsulamento? pergunte-me como! slide semi novo

Propriedade: implementação apenas para leitura, via decorator: class C(object): def init (self, x): self. x = x @property def x(self): return self. x a notação x protege o atributo contra acessos acidentais ( x = dois underscores à esquerda) slide semi novo

Propriedade: implementação 2 para leitura e escrita (Python >= 2.2): class C(object): def init (self, x=0): self. x = x def getx(self): return self. x def setx(self, valor): self. x = valor if valor >= 0 else 0 x = property(getx, setx) slide semi novo

Propriedade: implementação 3 para leitura e escrita (Python >= 2.6): class C(object): def init (self, x=0): self. x = x @property def x(self): return self. x @x.setter def x(self, valor): self. x = valor if valor >= 0 else 0 slide semi novo

Propriedade: exemplo de uso class ContadorTotalizador(Contador): def init (self): super(contadortotalizador, self). init () self. total = 0 def incluir(self, item): super(contadortotalizador, self).incluir(item) self. total += 1 @property def total(self): return self. total slide semi novo

Atributos protegidos Atributos protegidos em Python são salvaguardas servem para evitar atribuição ou sobrescrita acidental não para evitar usos (ou abusos) intencionais

Atributos protegidos Atributos protegidos em Python são salvaguardas servem para evita atribuição ou sobrescrita acidental não para evitar usos (ou abusos) intencionais >>> raisins._lineitem weight 10

Decoradores

Decoradores de funções Exemplos de decoradores: @property, @x.setter, @classmethod Não têm relação com o padrão de projeto decorator São funções que recebem a função decorada como argumento e produzem uma nova função que substitui a função decorada Tema de outro curso...

Decoradores de métodos Usados na definição de métodos em classes @property, @x.setter, @x.deleter: definem métodos getter, setter e deleter para propriedades @classmethod, @staticmethod: definem métodos que não precisam de uma instância para operar @abstractmethod, @abstractproperty: uso em classes abstratas (veremos logo mais)

classmethod x staticmethod Métodos estáticos são como funções simples embutidas em uma classe: não recebem argumentos automáticos Métodos de classe recebem a classe como argumento automático class Exemplo(object): @staticmethod def estatico(arg): return arg @classmethod def da_classe(cls, arg): return (cls, arg) >>> Exemplo.estatico('bar') 'bar' >>> Exemplo.da_classe('fu') (<class ' main.exemplo'>, 'fu')

Carta simples class Carta(object): def init (self, valor, naipe): self.valor = valor self.naipe = naipe def repr (self): return 'Carta(%r, %r)' % (self.valor, self.naipe) >>> zape = Carta('4', 'paus') >>> zape.valor '4' >>> zape Carta('4', 'paus')

Todas class Carta(object): naipes = 'espadas ouros paus copas'.split() valores = '2 3 4 5 6 7 8 9 10 J Q K A'.split() def init (self, valor, naipe): self.valor = valor self.naipe = naipe as cartas def repr (self): return 'Carta(%r, %r)' % (self.valor, self.naipe) @classmethod def todas(cls): return [cls(v, n) for n in cls.naipes for v in cls.valores] >>> monte = Carta.todas() >>> len(monte) 52 >>> monte[0] Carta('2', 'espadas') >>> monte[-3:] [Carta('Q', 'copas'), Carta('K', 'copas'), Carta('A', 'copas')]

Exemplo de classmethod É conveniente em todas ter acesso à classe para acessar os atributos (naipes, valores) e para instanciar as cartas class Carta(object): naipes = 'espadas ouros paus copas'.split() valores = '2 3 4 5 6 7 8 9 10 J Q K A'.split() def init (self, valor, naipe): self.valor = valor self.naipe = naipe def repr (self): return 'Carta(%r, %r)' % (self.valor, self.naipe) @classmethod def todas(cls): return [cls(v, n) for n in cls.naipes for v in cls.valores]

Decoradores de classes Novidade do Python 2.6, ainda pouco utilizada na prática Exemplo na biblioteca padrão a partir do Python 2.7: functools.total_ordering define automaticamente métodos para os operadores de comparação < > <= >= http://docs.python.org/library/functools.html#functools.total_ordering

from functools import total_ordering @total_ordering class Carta(object): naipes = 'espadas ouros paus copas'.split() valores = '2 3 4 5 6 7 8 9 10 J Q K A'.split() Cartas comparáveis def init (self, valor, naipe): self.valor = valor self.naipe = naipe def repr (self): return 'Carta(%r, %r)' % (self.valor, self.naipe) @classmethod def todas(cls): return [cls(v, n) for n in cls.naipes for v in cls.valores] def eq (self, outra): return ((self.valor, self.naipe) == (outra.valor, outra.naipe)) >>> dois >= as_ False >>> dois <= as_ True def peso(self): return (Carta.naipes.index(self.naipe) + len(carta.naipes) * Carta.valores.index(self.valor)) def gt (self, outra): return self.peso() > outra.peso()

Total ordering == lucro! >>> mao = [as_, dois, rei] >>> sorted(mao) [Carta('2', 'espadas'), Carta('K', 'copas'), Carta('A', 'copas')] from functools import total_ordering @total_ordering class Carta(object): #...várias linhas omitidas... def eq (self, outra): return ((self.valor, self.naipe) == (outra.valor, outra.naipe)) def peso(self): return (Carta.naipes.index(self.naipe) + len(carta.naipes) * Carta.valores.index(self.valor)) def gt (self, outra): return self.peso() > outra.peso()

Classes abstratas

Abstract Base Classes Novidade a partir do Python 2.6 a linguagem fez sucesso por 20 anos sem isso Permite pela primeira vez marcar explicitamente uma classe como abstrata e também métodos abstratos Documentação: procure Abstract Base Classes http://docs.python.org/2/library/abc.html

Abstract Base Classes Em Python (e C++ e outras linguagens), classes abstratas são usadas para definir bases comuns e para formalizar interfaces Por ser um recurso recente da linguagem, poucos projetos usam classes abstratas formalmente mas muitas classes abstratas já existem informalmente Exemplos: collections ABC (Library Reference)

Cao abstrato from abc import ABCMeta, abstractmethod class Cao(object): metaclass = ABCMeta qt_patas = 4 carnivoro = True def init (self, nome): self.nome = nome @abstractmethod def latir(self, vezes=1): """ deve exibir o latido no stdout """ def str (self): return self.nome def repr (self): return '{0}({1!r})'.format(self. class. name, self.nome)

Cao abstrato $ python -i cao_abc.py >>> Cao <class ' main.cao'> >>> Cao. metaclass <class 'abc.abcmeta'> >>> class Viralata(Cao):... """um cão genérico"""... >>> pipo = Viralata('Pipoe') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't instantiate abstract class Viralata with abstract methods latir

Cao concreto class Mastiff(Cao): """ O mastiff late diferente: >>> atos = Mastiff('Atos') >>> atos.latir() Atos: Wuff! """ def latir(self, vezes=1): # o mastiff não muda seu latido quando nervoso print self.nome + ':' + ' Wuff!' * vezes >>> adamastor = Mastiff('Adamastor') >>> adamastor.latir() Adamastor: Wuff!