Luciano Ramalho luciano@ramalho.org. setembro/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

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

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

Orientação a objetos e frameworks

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Modelagem OO com UML. Vítor E. Silva Souza ~ vitorsouza

MAB224 Programação de Computadores II. Prof. Franklin Marquezino Universidade Federal do Rio de Janeiro

Python Intermediário. terça-feira, 4 de agosto de 15

Tópicos em Engenharia de Computação

Introdução à Programação Aula 20 Definição de classes

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

Padrão Básico de Projeto: Interfaces e Polimorfismo

Análise e Projeto Orientado a Objetos

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

UML Unified Modeling Language

Organização de programas em Python. Vanessa Braganholo

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

Unisant Anna Gestão Empresarial com ERP 2014 Modelagem de Sistemas - UML e MER

Descritores de atributos em Python

Polimorfismo. Prof. Leonardo Barreto Campos 1

Programa do Módulo 2. Fundações do Modelo Objeto

UML Aspectos de projetos em Diagramas de classes

Java 2 Standard Edition Como criar classes e objetos

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

build UNIP Sistemas de Informação Análise Essencial de Sistemas 3 Prof.Marcelo Nogueira A produção de Software é uma atividade build and fix.

Programação Orientada a Objetos. Encapsulamento

Programação Orientada a Objetos em Java. Herança

Começando com Ruby on

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

Desenvolvimento de software orientado a características e dirigido por modelos

Programação Orientada a Objetos. Padrões de Criação

Modelos de Sistema by Pearson Education. Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 8 Slide 1.

Padrões de Projeto. Singleton

UNIVERSIDADE DO ESTADO DE SANTA CATARINA - UDESC DCC Departamento de Ciência da Computação Joinville-SC

FBV - Linguagem de Programação II. Um pouco sobre Java

PROGRAMANDO EM C# ORIENTADO A OBJETOS

Métodos de Construção de Software: Orientação a Objetos. Mestrado em Ciência da Computação 2008 Profa. Itana Gimenes

Computação II (MAB 225)

Reuso com Herança a e Composiçã

Danilo Borges da Silva

DESENVOLVIMENTO DE SOFTWARE. Introdução ao Visual Studio VB.Net. Programação Estruturada. Prof. Celso Candido ADS / REDES / ENGENHARIA

Histórico da Orientação a Objetos Ciclo de vida de Desenvolvimento de SW

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Design Pattern Implementation in Java and AspectJ

Orientação a Objetos com Java

Desenvolvimento de Sistemas Orientados a Objetos com UML UP/RUP: Projeto

Herança. Alberto Costa Neto DComp - UFS

Introdução ao TDD. Dionatan Moura. #guma10anos Abril de about.me/dionatanmoura

Abstract Factory Pattern

Modulo IIa Extra: Object

Programação Orientada a Objeto em Python

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

PROGRAMAÇÃO ORIENTADA A OBJETO EM PHP

Objetivos do mini curso. Conhecer a linguagem. Noção de programação utilizando Python. Aprender o báscio.

UML 01. Curso Superior de Tecnologia em Banco de Dados Disciplina: Projeto de Banco de Dados Relacional 1 Prof.: Fernando Hadad Zaidan

Repeater no GASweb. Regiões

Aspectos técnicos do desenvolvimento baseado em componentes

Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas

Prototype, um Design Patterns de Criação

Flying Circus Documentation

Programação Orientada a Objetos (DPADF 0063)

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Universidade Federal do Pará Centro de Tecnologia da Informação e Comunicação Grupo de Trabalho SET. Tutorial PyQT4

Engenharia de software para desenvolvimento com LabVIEW: Validação

Questões de Concursos Públicos sobre Orientação a Objetos e UML

Análise e Projeto Orientados a Objeto

Felipe Denis M. de Oliveira. Fonte: Alice e Carlos Rodrigo (Internet)

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

Python: Funções. Claudio Esperança

EMENTA DO CURSO. Tópicos:

Disciplina Técnicas de Modelagem

Introdução ao Paradigma Orientado a Objetos. Principais conceitos

Prof.: Clayton Maciel Costa

Algoritmos e programação

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Engenharia de Software I: Análise e Projeto de Software Usando UML

1 Detecção e correcção de erros Erros sintáticos Erros de execução Erros semânticos Erros semânticos...

Análise de Programação

Python: Módulos. Claudio Esperança

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI PCO203 Tópicos Especiais em Programação

Revisão de Banco de Dados

UML Linguagem de Modelagem Unificada

Programação de Computadores - I. Profª Beatriz Profº Israel

Banco de Dados Aula 02. Colégio Estadual Padre Carmelo Perrone Profº: Willian

Aula 02 Modelagem de Dados. Banco de Dados. Aula 02 Modelagem de Dados. Superior /2011 Redes Computadores - Disciplina: Banco de Dados -

Introdução à Programação Aula 11 Mais sobre ciclos e iteração

Especificação do 3º Trabalho

Gustavo Callou

Programação de Computadores - I. Profª Beatriz Profº Israel

Guia de Fatores de Qualidade de OO e Java

Padrões de projeto 1

Orientação a Objetos

Fundamentos de Banco de Dados e Modelagem de Dados

Programação com Objectos. Processamento de Dados I. 3. UML (Unified Modeling Language)

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Padrões de Projeto de Software Orientado a Objetos

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Gerador Menu. AVISO: A biblioteca só funciona corretamente com as versões 2.6 ou superiores ou 3.0 ou superiores.

Transcrição:

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

Aula 2 Introdução à Orientação Objetos em Python (continuação)

Objetivos desta aula Continuar apresentando os conceitos fundamentais de orientação a objetos, utilizando a terminologia e as práticas da comunidade Python Apresentar a metodologia de TDD (Test Driven Design) usando Doctests

Conceito: classe Uma categoria, ou tipo, de objeto Uma idéia abstrata, uma forma platônica Exemplo: classe Cão : Eu digo: Ontem eu comprei um cão Você não sabe exatamente qual cão, mas sabe: é um mamífero, quadrúpede, carnívoro pode ser domesticado (normalmente) cabe em um automóvel

Exemplar de cão: instância da classe Cao >>> rex = Cao() instanciação

Classe Cao class Mamifero(object): """lição de casa: implementar""" instanciação class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) >>> rex = Cao('Rex') >>> rex Cao('Rex') >>> print rex Rex >>> rex.qt_patas 4 >>> rex.latir() Rex: Au! >>> rex.latir(2) Rex: Au! Au! >>> rex.nervoso = True >>> rex.latir(3) Rex: Au! Au! Au! Au! Au! Au! >>> rex.qt_patas = 3 >>> fido = Cao('Fido ') >>> fido.qt_patas 4 >>> rex.peso Traceback...... AttributeError... oopy/exemplos/cao.py

Doctests Um dos módulos para fazer testes automatizados na biblioteca padrão de Python o outro módulo é o unittest, da família xunit Doctests foram criados para testar exemplos embutidos na documentação Usaremos doctests para especificar exercícios Exemplo: oopy/exemplos/cao.rst

Como atributos são acessados Ao buscar o.a (atributo a do objeto o da classe C), o interpretador Python faz o seguinte: 1) acessa atributo a da instancia o; caso não exista... 2) acessa atributo a da classe C de o (type(o) ou o. class ); caso nao exista... 3) busca o atributo a nas superclasses de C, conforme a MRO (method resolution order)

Classe Cao em Python class Mamifero(object): """lição de casa: implementar""" class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) init é o construtor, ou melhor, o inicializador self é o 1º parâmetro formal em todos os métodos de instância oopy/exemplos/cao.py

Classe Cao class Mamifero(object): """lição de casa: implementar""" class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) invocação >>> rex = Cao('Rex') >>> rex Cao('Rex') >>> print rex Rex >>> rex.qt_patas 4 >>> rex.latir() Rex: Au! >>> rex.latir(2) Rex: Au! Au! na invocação do método, a instância é passada automaticamente na posição do self oopy/exemplos/cao.py

Classe Cao em Python class Mamifero(object): """lição de casa: implementar""" class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) atributos de dados na classe funcionam como valores default para os atributos das instâncas atributos da instância só podem ser acessados via self oopy/exemplos/cao.py

generalização Mamifero: superclasse de Cao class Mamifero(object): """lição de casa: implementar""" UML diagrama de classe class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) especialização oopy/exemplos/cao.py

Subclasses de Cao Continuação de cao.py class Pequines(Cao): nervoso = True class Mastiff(Cao): def latir(self, vezes=1): # o mastiff não muda seu latido quando nervoso print self.nome + ':' + ' Wuff!' * vezes class SaoBernardo(Cao): def init (self, nome): Cao. init (self, nome) self.doses = 10 def servir(self): if self.doses == 0: raise ValueError('Acabou o conhaque!') self.doses -= 1 msg = '{0} serve o conhaque (restam {1} doses)' print msg.format(self.nome, self.doses) Diz a lenda que o cão São Bernardo leva um pequeno barril de conhaque para resgatar viajantes perdidos na neve.

Subclasses de Cao class Pequines(Cao): nervoso = True class Mastiff(Cao): def latir(self, vezes=1): # o mastiff não muda seu latido quando nervoso print self.nome + ':' + ' Wuff!' * vezes class SaoBernardo(Cao): def init (self, nome): Cao. init (self, nome) self.doses = 10 def servir(self): if self.doses == 0: raise ValueError('Acabou o conhaque!') self.doses -= 1 msg = '{0} serve o conhaque (restam {1} doses)' print msg.format(self.nome, self.doses) >>> sansao = SaoBernardo('Sansao') >>> sansao.servir() Sansao serve o conhaque (restam 9 doses) >>> sansao.doses = 1 >>> sansao.servir() Sansao serve o conhaque (restam 0 doses) >>> sansao.servir() Traceback (most recent call last):... ValueError: Acabou o conhaque!

Subclasses de Cao Continuação de cao.py class Pequines(Cao): nervoso = True class Mastiff(Cao): def latir(self, vezes=1): # o mastiff não muda seu latido quando nervoso print self.nome + ':' + ' Wuff!' * vezes class SaoBernardo(Cao): def init (self, nome): Cao. init (self, nome) self.doses = 10 def servir(self): if self.doses == 0: raise ValueError('Acabou o conhaque!') self.doses -= 1 msg = '{0} serve o conhaque (restam {1} doses)' print msg.format(self.nome, self.doses)

Herança múltipla Refatoração de cao.py para cao2.py mixin herança múltipla class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) class Grande(object): """ Mixin: muda o latido""" def latir(self, vezes=1): # faz de conta que cães grandes não mudam # seu latido quando nervosos print self.nome + ':' + ' Wuff!' * vezes Reutilizar o latido do mastiff em outros cães grandes herança múltipla class Mastiff(Grande, Cao): """ O mastiff é o maior cão que existe """ class SaoBernardo(Grande, Cao): def init (self, nome): Cao. init (self, nome) self.doses = 10 def servir(self): if self.doses == 0: raise ValueError('Acabou o conhaque!') self.doses -= 1 msg = '{0} serve o conhaque (restam {1} doses)' print msg.format(self.nome, self.doses) oopy/exemplos/cao2.py

Herança múltipla class Cao(Mamifero): qt_patas = 4 carnivoro = True nervoso = False def init (self, nome): self.nome = nome def latir(self, vezes=1): # quando nervoso, late o dobro vezes = vezes + (self.nervoso * vezes) print self.nome + ':' + ' Au!' * vezes def str (self): return self.nome def repr (self): return 'Cao({0!r})'.format(self.nome) class Grande(object): """ Mixin: muda o latido""" def latir(self, vezes=1): # faz de conta que cães grandes não mudam # seu latido quando nervosos print self.nome + ':' + ' Wuff!' * vezes class Mastiff(Grande, Cao): """ O mastiff é o maior cão que existe """ class SaoBernardo(Grande, Cao): def init (self, nome): Cao. init (self, nome) self.doses = 10 def servir(self): if self.doses == 0: raise ValueError('Acabou o conhaque!') self.doses -= 1 msg = '{0} serve o conhaque (restam {1} doses)' print msg.format(self.nome, self.doses) oopy/exemplos/cao2.py

Relógio com classe import Tkinter from time import strftime class Relogio(Tkinter.Label): def init (self): Tkinter.Label. init (self) self.pack() self['text'] = strftime('%h:%m:%s') self['font'] = 'Helvetica 120 bold' self.tictac() def tictac(self): agora = strftime('%h:%m:%s') if agora!= self['text']: self['text'] = agora self.after(100, self.tictac) rel = Relogio() rel.mainloop() oopy/exemplos/relogio_oo.py

Uma pequena parte da hierarquia de classes do Tkinter herança múltipla mixin herança múltipla

Um pouco mais da hierarquia de classes do Tkinter

Hierarquia de classes dos objetos gráficos dotkinter

As duas hierarquias de um sistema OO Hierarquia de classes is-a: é um Hierarquia de objetos part-of: parte de Object-oriented Analysis and Design with Applications 2ed. - Grady Booch

As duas hierarquias de um sistema OO Object-oriented Analysis and Design with Applications 3ed. - Booch et. al.

from Tkinter import Frame, Label, Button Timer class Timer(Frame): def init (self): Frame. init (self) self.inicio = self.agora = 15 self.pendente = None # alarme pendente self.grid() self.mostrador = Label(self, width=2, anchor='e', font='helvetica 120 bold',) self.mostrador.grid(column=0, row=0, sticky='nswe') self.bt_start = Button(self, text='start', command=self.start) self.bt_start.grid(column=0, row=1, sticky='we') self.atualizar_mostrador() def atualizar_mostrador(self): self.mostrador['text'] = str(self.agora) def start(self): if self.pendente: self.after_cancel(self.pendente) self.agora = self.inicio self.atualizar_mostrador() self.pendente = self.after(1000, self.tictac) Exemplo simples de composição def tictac(self): self.agora -= 1 self.atualizar_mostrador() if self.agora > 0: self.pendente = self.after(1000, self.tictac) timer = Timer() timer.mainloop() oopy/exemplos/timer.py

from Tkinter import Frame, Label, Button Timer class Timer(Frame): def init (self): Frame. init (self) self.inicio = self.agora = 15 self.pendente = None # alarme pendente self.grid() self.mostrador = Label(self, width=2, anchor='e', font='helvetica 120 bold',) self.mostrador.grid(column=0, row=0, sticky='nswe') self.bt_start = Button(self, text='start', command=self.start) self.bt_start.grid(column=0, row=1, sticky='we') self.atualizar_mostrador() def atualizar_mostrador(self): self.mostrador['text'] = str(self.agora) def start(self): if self.pendente: self.after_cancel(self.pendente) self.agora = self.inicio self.atualizar_mostrador() self.pendente = self.after(1000, self.tictac) def tictac(self): self.agora -= 1 self.atualizar_mostrador() if self.agora > 0: self.pendente = self.after(1000, self.tictac) timer = Timer() timer.mainloop() oopy/exemplos/timer.py

Composição Arranjo de partes de um sistema mostrador = Label() componentes, sub-componentes... bt_start = Button() timer = Timer()

instanciação instanciação from Tkinter import Frame, Label, Button class Timer(Frame): def init (self): Frame. init (self) self.inicio = self.agora = 15 self.pendente = None # alarme pendente self.grid() self.mostrador = Label(self, width=2, anchor='e', font='helvetica 120 bold',) self.mostrador.grid(column=0, row=0, sticky='nswe') self.bt_start = Button(self, text='start', command=self.start) self.bt_start.grid(column=0, row=1, sticky='we') self.atualizar_mostrador() def atualizar_mostrador(self): self.mostrador['text'] = str(self.agora) def start(self): if self.pendente: self.after_cancel(self.pendente) self.agora = self.inicio self.atualizar_mostrador() self.pendente = self.after(1000, self.tictac) def tictac(self): self.agora -= 1 self.atualizar_mostrador() if self.agora > 0: self.pendente = self.after(1000, self.tictac) instanciação timer = Timer() timer.mainloop() oopy/exemplos/timer.py

Composição em UML composição composição

Composição em UML composição composição

Interface Interface é um conceito essencial em OO não depende de uma palavra reservada A interface fornece uma separação entre a implementação de uma abstração e seus clientes. Ela limita os detalhes de implementação que os clientes podem ver. Também especifica a funcionalidade que as implementações devem prover. P. S. Canning, W. R. Cook, W. L. Hill, and W. G. Olthoff. 1989. Interfaces for strongly-typed objectoriented programming. In Conference proceedings on Object-oriented programming systems, languages and applications (OOPSLA '89). ACM, New York, NY, USA, 457-467. DOI=10.1145/74877.74924 http://doi.acm.org/10.1145/74877.74924

Interfaces e protocolos Em SmallTalk, as interfaces eram chamadas de protocolos. Não há verificação de interfaces na linguagem, mas algumas IDEs ( browsers ) permitem agrupar os métodos por protocolo para facilitar a leitura Um protocolo é uma interface informal, não declarada porém implementada por métodos concretos

Interfaces em Python Conceitualmente, sempre existiram como protocolos Não havia maneira formal de especificar interfaces em Python até a versão 2.5 usava-se termos como uma sequência ou a file-like object Agora temos ABC (Abstract Base Class) com herança múltipla, como em C++

Exemplo: tômbola Sortear um a um todos os itens de uma coleção finita, sem repetir A mesma lógica é usada em sistemas para gerenciar banners online

Interface da tômbola Carregar itens Misturar itens Sortear um item Indicar se há mais itens

Projeto da tômbola UML: diagrama de classe

TDD: Test Driven Design Metodologia de desenvolvimento iterativa na qual, para cada funcionalidade nova, um teste é criado antes do código a ser implementado Esta inversão ajuda o programador a desenvolver com disciplina apenas uma funcionalidade de cada vez, mantendo o foco no teste que precisa passar Cada iteração de teste/implementação deve ser pequena e simples: baby steps (passinhos de bebê)

TDD: demonstração ao vivo Implementação da classe Tombola, com testes feitos em Doctest oopy/exemplos/tombola-final.py

Implementação da tômbola # coding: utf-8 import random class Tombola(object): itens = None def carregar(self, itens): self.itens = list(itens) def carregada(self): return bool(self.itens) Python 2.2 a 2.7 def misturar(self): random.shuffle(self.itens) def sortear(self): return self.itens.pop()

Implementação da tômbola import random class Tombola: itens = None def carregar(self, itens): self.itens = list(itens) def carregada(self): return bool(self.itens) Python 3.x def misturar(self): random.shuffle(self.itens) def sortear(self): return self.itens.pop()