SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Introdução à
                  Orientação a Objetos
                 em Python (sem sotaque)

                                  Luciano Ramalho
                              luciano@ramalho.org
Wednesday, November 2, 2011
Saiu em uma revista...




Wednesday, November 2, 2011
Python
                              com
                              sotaque
                              javanês




Wednesday, November 2, 2011
Não use
                              ; no final
                              das linhas


                              Não é um erro
                              sintático, mas é
                              desnecessário
                              e portanto
                              deselegante
Wednesday, November 2, 2011
Esses
                              não são
                              métodos
                              da classe
                              Esses métodos
                              agem sobre as
                              instâncias (note
                              o self). Métodos
                              de classe são
                              decorados com
                              @classmethod.
Wednesday, November 2, 2011
Não
                              abuse de
                              getters e
                              setters
                              Em Python não
                              usamos muitos
                              getters e setters
                              dessa forma.
                              Para controlar
                              acesso usamos
                              properties.
Wednesday, November 2, 2011
Características básicas




Wednesday, November 2, 2011
OO em Python se
         parece com...
              herança múltipla, como C++
              sobrecarga de operadores, como C++
              não obriga a criar classes, como C++
              tipagem dinâmica, como Smalltalk e Ruby
                   tipagem dinâmica, mas não tipagem fraca




Wednesday, November 2, 2011
O que é tipagem fraca?
              conversão automática entre tipos
              comum em linguagens de scripting (JavaScript, Perl, PHP)
              uma fonte de bugs difíceis de localizar e tratar

               ◀ "9" + 10
               ▶ "910"            Exemplos reais digitados
               --
               ◀ "9" * 10         no console JavaScript do
               ▶ 90                     Firefox 6.0
               --
               ◀ "9" - 10
               ▶ -1
               --                 Atenção: Python
               ◀ "9" + (-10)
               ▶ "9-10"             não é assim!
Wednesday, November 2, 2011
Tipagem dinâmica
                   Variáveis (e parâmetros) não têm tipos declarados e
                   podem ser associados a objetos de qualquer tipo
                   em tempo de execução
                   Também conhecida como “duck typing” (tipagem
                   pato) nas comunidades Python, Ruby e Smalltalk
              >>> def dobro(n):
              ...     '''devolve duas vezes n'''
              ...     return n + n
              ...
              >>> dobro(7)
              14
              >>> dobro('Spam')
              'SpamSpam'
              >>> dobro([10, 20, 30])
              [10, 20, 30, 10, 20, 30]
Wednesday, November 2, 2011
Tipagem dinâmica forte
                Python não faz conversão automática de tipos
                      exceções, por praticidade:   int → long → float
                                                   str → unicode
   >>> "9" + 10
   TypeError: cannot concatenate 'str' and 'int' objects
   >>> "9" * 10
   '9999999999'
   >>> "9" - 10
   TypeError: unsupported operand type(s) for -: 'str'
   and 'int'
   >>> "9" + (-10)
   TypeError: cannot concatenate 'str' and 'int' objects



Wednesday, November 2, 2011
Para quem conhece Java
              Python não tem interfaces
                   mas tem herança múltipla e classes abstratas
              Python não tem sobrecarga de métodos
                   mas tem sobrecarga de operadores e passagem de
                   argumentos flexível
              Python não tem tipos primitivos
                   tudo é objeto (desde Python 2.2, dez/2001)
               >>> 5 .__add__(3)
               8

Wednesday, November 2, 2011
Ex: 5 é uma instância de int
     >>> 5 .__add__(3)
     8
     >>> type(5)                              atributos de int
     <type 'int'>
     >>> dir(5)
     ['__abs__', '__add__', '__and__', '__class__', '__cmp__',
     '__coerce__', '__delattr__', '__div__', '__divmod__',
     '__doc__', '__float__', '__floordiv__', '__format__',
     '__getattribute__', '__getnewargs__', '__hash__', '__hex__',
     '__index__', '__init__', '__int__', '__invert__',
     '__long__', '__lshift__', '__mod__', '__mul__', '__neg__',
     '__new__', '__nonzero__', '__oct__', '__or__', '__pos__',
     '__pow__', '__radd__', '__rand__', '__rdiv__',
     '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
     '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__',
     '__ror__', '__rpow__', '__rrshift__', '__rshift__',
     '__rsub__', '__rtruediv__', '__rxor__', '__setattr__',
     '__sizeof__', '__str__', '__sub__', '__subclasshook__',
     '__truediv__', '__trunc__', '__xor__', 'conjugate',
     'denominator', 'imag', 'numerator', 'real']
Wednesday, November 2, 2011
Sintaxe de classes




Wednesday, November 2, 2011
Classe com 3 métodos

           class Contador(object):
               def __init__(this):
                   this.contagem = {}

                       def incluir(this, item):
                           qtd = this.contagem.get(item, 0) + 1
                           this.contagem[item] = qtd

                       def contar(this, item):
                           return this.contagem[item]



Wednesday, November 2, 2011
Classe com 3 métodos

           class Contador(object):
               def __init__(this):                não usamos
                   this.contagem = {}                 this

                       def incluir(this, item):
                           qtd = this.contagem.get(item, 0) + 1
                           this.contagem[item] = qtd

                       def contar(this, item):
                           return this.contagem[item]



Wednesday, November 2, 2011
Classe com 3 métodos

           class Contador(object):
               def __init__(self):                  usamos
                   self.contagem = {}                 self

                       def incluir(self, item):
                           qtd = self.contagem.get(item, 0) + 1
                           self.contagem[item] = qtd

                       def contar(self, item):
                           return self.contagem[item]



Wednesday, November 2, 2011
Peculiaridade: self explícito
              Todos os métodos de instâncias devem declarar o self
              como primeiro parâmetro
              Todos os acessos a atributos (inclusive métodos) das
              instâncias devem ser feitos via referência explícita a self

                         class Contador(object):
                             def __init__(self):
                                 self.contagem = {}

                              def incluir(self, item):
                                  qtd = self.contagem.get(item, 0) + 1
                                  self.contagem[item] = qtd
Wednesday, November 2, 2011
Ex: uso da classe Contador
                                              não existe o
         >>>         cont = Contador()
         >>>         palavra = 'abacaxi'     operador new
         >>>         for letra in palavra:
         ...           cont.incluir(letra)
         ...
         >>>         for letra in sorted(set(pal)):
         ...           print letra, cont.contar(letra)
         ...
         a 3
         b 1
         c 1
         i 1
         x 1

Wednesday, November 2, 2011
Convenções
              classes devem herdar de object ou de outras classes
              que herdam de object
                   classes antigas (‘old style’) não seguem essa regra
                   não existem mais classes antigas em Python 3
              construtor deve se chamar __new__ (uso raro)
              inicializador deve se chamar __init__ (uso comum)
              o __init__ faz o papel do que chamamos de construtor
              em outras linguagens

Wednesday, November 2, 2011
__init__ versus __new__

              __init__ recebe uma instância já construída, e sua
              função é incializar os atributos da instância
                   isso é o mesmo que acontece em Java!
              Em Python temos mais controle: podemos
              sobrescrever o método __new__ da classe para
              interferir no processo de construção da instância
                   na prática é bem raro implementarmos __new__
                   técnica avançada de meta-programação

Wednesday, November 2, 2011
Instâncias abertas

              instâncias podem receber atributos dinamicamente
              por isso às vezes é útil criar classes vazias
                   não muito comum




Wednesday, November 2, 2011
Exemplo: classe vazia
    >>> class Animal(object):
                                          pass serve para
    ...     pass
    ...                                  criar blocos vazios
    >>> baleia = Animal()
    >>> baleia.nome
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Animal' object has no attribute 'nome'
    >>> baleia.nome = 'Moby Dick'
    >>> baleia.peso = 1200
    >>> print '{0.nome} ({0.peso:.1f})'.format(baleia)
    Moby Dick (1200.0)




Wednesday, November 2, 2011
Classes abertas?
              Em Ruby as classes são “abertas”, a sintaxe comum
              permite que um módulo redefina uma classe e adicione
              atributos a uma classe definida em outro módulo
              É uma violação do princípio “Open Closed” (SOLID)
                   “entidades de software (classes, módulos, funções etc.)
                   devem ser abertas para extensão mas fechadas para
                   modificação” (Bertrand Meyer, OO Sw. Construction)
              Em Python isso é chamado de “monkey patching”, usa
              uma sintaxe de reflexão explícita e não é
              considerada uma boa prática (mas acontece)

Wednesday, November 2, 2011
Atributos
         de classe × de instância
         >>> class Animal(object):   atributo da classe
         ...    nome = 'Rex'
         ...
         >>> cao = Animal()           atributo encontrado
         >>> cao.nome
         'Rex'                              na classe
         >>> cao.nome = 'Fido'
         >>> cao.nome
         'Fido'                          atributo criado
         >>> Animal.nome                  na instanncia
         'Rex'
         >>> dino = Animal()
         >>> dino.nome               nada mudou na classe
         'Rex'
Wednesday, November 2, 2011
Métodos de classe/estáticos
              Indicados por decoradores de função

             class Exemplo(object):
                 @classmethod
                 def da_classe(cls, arg):
                     return (cls, arg)
                 @staticmethod
                 def estatico(arg):
                     return arg

             >>> Exemplo.da_classe('fu')
             (<class '__main__.Exemplo'>, 'fu')
             >>> Exemplo.estatico('bar')
             'bar'
Wednesday, November 2, 2011
Herança
              no exemplo abaixo, ContadorTolerante extende Contador
              o método contar está sendo sobrescrito
                                       class Contador(object):
              os métodos __init__ e        def __init__(self):
                                               self.contagem = {}
               incluir são herdados
                                           def incluir(self, item):
                                               qtd = self.contagem.get(item, 0) + 1
                                               self.contagem[item] = qtd

                                           def contar(self, item):
                                               return self.contagem[item]


        class ContadorTolerante(Contador):

                  def contar(self, item):
                      return self.contagem.get(item, 0)
Wednesday, November 2, 2011
Invocar método de
         super-classe
              A forma mais simples:

       class ContadorTotalizador(Contador):
           def __init__(self):
               Contador.__init__(self)
               self.total = 0

                  def incluir(self, item):
                      Contador.incluir(self, item)
                      self.total += 1




Wednesday, November 2, 2011
Invocar método de
         super-classe
              A forma mais correta:

       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




Wednesday, November 2, 2011
Herança múltipla
              classe que totaliza e não levanta exceções:

         class ContadorTT(ContadorTotalizador, ContadorTolerante):
             pass


              como funciona:
                   MRO = ordem de resolução de métodos
           >>> ContadorTT.__mro__
           (<class '__main__.ContadorTT'>,
            <class '__main__.ContadorTotalizador'>,
            <class '__main__.ContadorTolerante'>,
            <class '__main__.Contador'>,
            <type 'object'>)
Wednesday, November 2, 2011
Uso de herança múltipla
             >>>        from contadores import *
             >>>        class ContadorTT(ContadorTotalizador,
             ...          ContadorTolerante):
             ...            pass
             ...
             >>>        ctt = ContadorTT()
             >>>        for letra in 'abacaxi':
             ...          ctt.incluir(letra)
             ...
             >>>        ctt.total
             7
             >>>        ctt.contar('a')
             3
             >>>        ctt.contar('z')
             0


Wednesday, November 2, 2011
Encapsulamento
              Propriedades:
                   encapsulamento para quem precisa de
                   encapsulamento

                   >>>        a = C()        violação de
                   >>>        a.x = 10    encapsulamento?
                   >>>        print a.x
                   10
                   >>>        a.x = -10
                   >>>        print a.x     pergunte-me
                   0                           como!


Wednesday, November 2, 2011
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)


Wednesday, November 2, 2011
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)




Wednesday, November 2, 2011
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



Wednesday, November 2, 2011
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




Wednesday, November 2, 2011
Polimorfismo: definição
      O conceito de “polimorfismo” significa que podemos tratar
      instâncias de diferentes classes da mesma maneira.

      Assim, podemos enviar uma mensagem a um objeto sem
      saber de antemão qual é o seu tipo, e o objeto ainda assim
      fará “a coisa certa”, pelo menos do seu ponto de vista.

      Scott Ambler - The Object Primer, 2nd ed. - p. 173




Wednesday, November 2, 2011
Polimorfismo
              Fatiamento e len
                   listas e strings são sequências

           >>> l = [1, 2, 3]
           >>> l[:2]
           [1, 2]
           >>> 'casa'[:2]
           'ca'
           >>> len(l)
           3
           >>> len('casa')
           4



Wednesday, November 2, 2011
Polimorfismo
       >>> s = 'Python: simples e correta'
       >>> for letra in s[:6]: print letra
       P
       y
       t
       h
       o
       n
       >>> for letra in reversed(s): print letra
       ...
       a
       t
       e
       r
       r
       o
       c
Wednesday, November 2, 2011
Polimorfismo
      >>> l = range(10)
      >>> l
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      >>> l[0]
      0
      >>> l[-1]
      9
      >>> l[:3]
      [0, 1, 2]
      >>> for n in reversed(l): print n
      ...
      9
      8
      7
      6
      5
      4
      3
Wednesday, November 2, 2011
Exemplo: baralho polimórfico
              começamos com uma classe bem simples:


       class Carta(object):
           def __init__(self, valor, naipe):
               self.valor = valor
               self.naipe = naipe
           def __repr__(self):
               return '<%s de %s>' % (self.valor, self.naipe)




Wednesday, November 2, 2011
Baralho polimórfico 2
              métodos especiais: __len__, __getitem__`
                   com esses métodos, Baralho implementa o
                   protocolo das sequências imutáveis
                       class Baralho(object):
                           naipes = 'paus copas espadas ouros'.split()
                           valores = 'A 2 3 4 5 6 7 8 9 10 J Q K'.split()

                              def __init__(self):
                                  self.cartas = [Carta(v, n)
                                                   for n in self.naipes
                                                   for v in self.valores]
                              def __len__(self):
                                  return len(self.cartas)
                              def __getitem__(self, pos):
                                  return self.cartas[pos]
Wednesday, November 2, 2011
Baralho polimórfico 3
      >>> from baralho import Baralho
      >>> b = Baralho()
      >>> len(b)
      52
      >>> b[0], b[1], b[2]
      (<A de paus>, <2 de copas>, <3 de copas>)
      >>> for carta in reversed(b): print carta
      ...
      <K de ouros>
      <Q de ouros>
      <J de ouros>
      <10 de ouros>
      <9 de ouros>
      <8 de ouros>
      <7 de ouros>
      <6 de ouros>
      <5 de ouros>
Wednesday, November 2, 2011
Baralho polimórfico 4
       >>> from baralho import Baralho
       >>> b = Baralho()
       >>> len(b)
       52
       >>> b[:3]
       [<A de paus>, <2 de paus>, <3 de paus>]
       >>> from random import choice
       >>> for i in range(5): print choice(b)
       ...
       <Q de copas>
       <4 de ouros>
                                          a mesma carta pode
       <A de copas>                         sair duas vezes!
       <5 de ouros>
       <9 de paus>
       >>> for i in range(5): print choice(b)
       ...
       <3 de paus>
       <9 de copas>
Wednesday, November 2, 2011
Baralho polimórfico 5
       >>> from random import shuffle        Python vem com
       >>> l = range(10)
       >>> l                                 pilhas incluídas!
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
       >>> shuffle(l)
       >>> l
       [7, 6, 3, 2, 9, 5, 0, 4, 1, 8]
       >>> shuffle(b)
       Traceback (most recent call last):
         File "<stdin>", line 1, in <module>
         File "/System/Library/Frameworks/Python.framework/
       Versions/2.6/lib/python2.6/random.py", line 275, in
       shuffle
           x[i], x[j] = x[j], x[i]
       TypeError: 'Baralho' object does not support item
       assignment
                              ooops...
Wednesday, November 2, 2011
Baralho polimórfico 6
                                                 monkey-
    >>> def meu_setitem(self, pos, valor):        patch
    ...     self.cartas[pos] = valor
    ...
    >>> Baralho.__setitem__ = meu_setitem
    >>> shuffle(b)                                 agora
    >>> b[:5]                                    funciona!
    [<J de espadas>, <Q de paus>, <2 de paus>,
    <6 de paus>, <A de espadas>]
    >>>




Wednesday, November 2, 2011
Baralho polimórfico 7
              fazendo direito (sem monkey-patch)

                       class Baralho(object):
                           naipes = 'paus copas espadas ouros'.split()
                           valores = 'A 2 3 4 5 6 7 8 9 10 J Q K'.split()

                              def __init__(self):
                                  self.cartas = [Carta(v, n)
                                                   for n in self.naipes
                                                   for v in self.valores]
                              def __len__(self):
                                  return len(self.cartas)
                              def __getitem__(self, pos):
                                  return self.cartas[pos]
                              def __setitem__(self, pos, item):
                                  self.cartas[pos] = item
Wednesday, November 2, 2011
Academia
   Python
        instrutor: Luciano Ramalho
        112 horas/aula, 3½ meses       !"!#$%&!'()*+,-           COM LUCIANO RAMALHO


        5 módulos
                                       A Academia Python dá uma visão acessível e prática da linguagem: principais
                                       bibliotecas, desenvolvimento Web com Django, receitas para tarefas comuns,
                                                          !
                                       programação Orientada a Objetos e multi-paradigma e testes automatizados.
                                                        !
                                       As academias da Globalcode são formações completas compostas por vários
                                                        !

              Introdução à linguagem   módulos com muito mais tempo para os alunos interagirem com os instrutores.
                                                        !
                                                        !
                                       A Academia Python tem cinco módulos totalizando 112 horas aula. É fruto da
                                                        !
                                       união entre a qualidade e metodologia da Globalcode e a experiência e

              OO e frameworks
                                       conhecimento do Luciano Ramalho.
                                                             Módulos da Academia Python:
                                                                 PY1 - Introdução à linguagem Python


              Django + Jquery
                                                                 PY2 - Orientação a Objetos e frameworks
                                                                 PY3 - Desenvolvimento Web com Django e JQuery
                                                                 PY4 - Django pro ssional


              Django profissional
                                                                 PY5 - Cloud, NoSQL e novas arquiteturas

                                       @luciano              !"#$%&'()%*+),%-.',%/'*0
                                                    Mais informações:

              Cloud, NoSQL etc.                     !"#$%&'()%*+),%-./,%0/*12           2!""#$%"&'())%*


Wednesday, November 2, 2011

Mais conteúdo relacionado

Mais procurados

Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
Java: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de ErrosJava: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de ErrosArthur Emanuel
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Luciano Ramalho
 
Logica programacao python-slides
Logica programacao python-slidesLogica programacao python-slides
Logica programacao python-slidesronaldo ramos
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesElaine Cecília Gatto
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
UML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesUML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesRodrigo Cascarrolho
 
Tratamento de exceções
Tratamento de exceçõesTratamento de exceções
Tratamento de exceçõesAlvaro Oliveira
 
Normalização - Banco de Dados
Normalização - Banco de DadosNormalização - Banco de Dados
Normalização - Banco de DadosRoberto Grande
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)Armando Daniel
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggersDaniel Maia
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Daniel Brandão
 
Exercício resolvido normalização
Exercício resolvido normalizaçãoExercício resolvido normalização
Exercício resolvido normalizaçãoTicianne Darin
 

Mais procurados (20)

Introdução ao SQL
Introdução ao SQLIntrodução ao SQL
Introdução ao SQL
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Java: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de ErrosJava: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de Erros
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Logica programacao python-slides
Logica programacao python-slidesLogica programacao python-slides
Logica programacao python-slides
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e Funções
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Modulo 15 PSI
Modulo 15 PSIModulo 15 PSI
Modulo 15 PSI
 
UML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesUML - Criando Diagramas Eficientes
UML - Criando Diagramas Eficientes
 
Tratamento de exceções
Tratamento de exceçõesTratamento de exceções
Tratamento de exceções
 
Normalização - Banco de Dados
Normalização - Banco de DadosNormalização - Banco de Dados
Normalização - Banco de Dados
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)
 
Psi m14
Psi m14Psi m14
Psi m14
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggers
 
Python Orientação a Objeto
Python Orientação a ObjetoPython Orientação a Objeto
Python Orientação a Objeto
 
Modelo de von neumann melhorado
Modelo de von neumann melhoradoModelo de von neumann melhorado
Modelo de von neumann melhorado
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)
 
Exercício resolvido normalização
Exercício resolvido normalizaçãoExercício resolvido normalização
Exercício resolvido normalização
 

Semelhante a Introdução à Orientação a Objetos em Python

Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Luciano Ramalho
 
Introducao ao python - Luciana Mota
Introducao ao python - Luciana MotaIntroducao ao python - Luciana Mota
Introducao ao python - Luciana Motalucianacmota
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Python 3.x - Ihh.. E agora ? Como faço ?
Python 3.x - Ihh.. E agora ? Como faço ?Python 3.x - Ihh.. E agora ? Como faço ?
Python 3.x - Ihh.. E agora ? Como faço ?Marcel Caraciolo
 
Introdução a programação em python d2
Introdução a programação em python d2Introdução a programação em python d2
Introdução a programação em python d2Moises de Paula
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonAlvaro Oliveira
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em PythonRober Guerra
 
Python: programação divertida novamente
Python: programação divertida novamentePython: programação divertida novamente
Python: programação divertida novamenteRodrigo Amaral
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosFelipe Hummel
 
(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!Danilo J. S. Bellini
 
Py sintaxe
Py sintaxePy sintaxe
Py sintaxeFlapenta
 
Computação Científica com SciPy - Brevíssimo Tutorial
Computação Científica com SciPy - Brevíssimo TutorialComputação Científica com SciPy - Brevíssimo Tutorial
Computação Científica com SciPy - Brevíssimo TutorialFabio Spanhol
 

Semelhante a Introdução à Orientação a Objetos em Python (20)

Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011
 
Introducao ao python - Luciana Mota
Introducao ao python - Luciana MotaIntroducao ao python - Luciana Mota
Introducao ao python - Luciana Mota
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Python 3.x - Ihh.. E agora ? Como faço ?
Python 3.x - Ihh.. E agora ? Como faço ?Python 3.x - Ihh.. E agora ? Como faço ?
Python 3.x - Ihh.. E agora ? Como faço ?
 
Introdução a programação em python d2
Introdução a programação em python d2Introdução a programação em python d2
Introdução a programação em python d2
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em Python
 
Aula python
Aula pythonAula python
Aula python
 
Slide_Python.pdf
Slide_Python.pdfSlide_Python.pdf
Slide_Python.pdf
 
Dinamicas
DinamicasDinamicas
Dinamicas
 
Python: programação divertida novamente
Python: programação divertida novamentePython: programação divertida novamente
Python: programação divertida novamente
 
aula3_python.pptx
aula3_python.pptxaula3_python.pptx
aula3_python.pptx
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetos
 
(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!
 
Py sintaxe
Py sintaxePy sintaxe
Py sintaxe
 
apresentacao.pdf
apresentacao.pdfapresentacao.pdf
apresentacao.pdf
 
Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
 
Computação Científica com SciPy - Brevíssimo Tutorial
Computação Científica com SciPy - Brevíssimo TutorialComputação Científica com SciPy - Brevíssimo Tutorial
Computação Científica com SciPy - Brevíssimo Tutorial
 

Mais de Luciano Ramalho

Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Luciano Ramalho
 
Encapsulamento com descritores
Encapsulamento com descritoresEncapsulamento com descritores
Encapsulamento com descritoresLuciano Ramalho
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoLuciano Ramalho
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
OO em Python sem sotaque
OO em Python sem sotaqueOO em Python sem sotaque
OO em Python sem sotaqueLuciano Ramalho
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
Alex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsAlex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsLuciano Ramalho
 
JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)Luciano Ramalho
 
JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)Luciano Ramalho
 

Mais de Luciano Ramalho (20)

Wiki-wiki S/A
Wiki-wiki S/AWiki-wiki S/A
Wiki-wiki S/A
 
Mongodb: agregação
Mongodb: agregaçãoMongodb: agregação
Mongodb: agregação
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)
 
Encapsulamento com descritores
Encapsulamento com descritoresEncapsulamento com descritores
Encapsulamento com descritores
 
Iteraveis e geradores
Iteraveis e geradoresIteraveis e geradores
Iteraveis e geradores
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojo
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Dojo com Processing
Dojo com ProcessingDojo com Processing
Dojo com Processing
 
Dojo com Arduino
Dojo com ArduinoDojo com Arduino
Dojo com Arduino
 
Open Library no Mongodb
Open Library no MongodbOpen Library no Mongodb
Open Library no Mongodb
 
OO em Python sem sotaque
OO em Python sem sotaqueOO em Python sem sotaque
OO em Python sem sotaque
 
Modelos ricos
Modelos ricosModelos ricos
Modelos ricos
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Ensinando OO com Python
Ensinando OO com PythonEnsinando OO com Python
Ensinando OO com Python
 
Alex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsAlex Martelli's Python Design Patterns
Alex Martelli's Python Design Patterns
 
Dspace em 5 minutos
Dspace em 5 minutosDspace em 5 minutos
Dspace em 5 minutos
 
JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)
 
JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)JavaScript agora é sério (FISL 2011)
JavaScript agora é sério (FISL 2011)
 
Wiki sa-v2
Wiki sa-v2Wiki sa-v2
Wiki sa-v2
 

Introdução à Orientação a Objetos em Python

  • 1. Introdução à Orientação a Objetos em Python (sem sotaque) Luciano Ramalho luciano@ramalho.org Wednesday, November 2, 2011
  • 2. Saiu em uma revista... Wednesday, November 2, 2011
  • 3. Python com sotaque javanês Wednesday, November 2, 2011
  • 4. Não use ; no final das linhas Não é um erro sintático, mas é desnecessário e portanto deselegante Wednesday, November 2, 2011
  • 5. Esses não são métodos da classe Esses métodos agem sobre as instâncias (note o self). Métodos de classe são decorados com @classmethod. Wednesday, November 2, 2011
  • 6. Não abuse de getters e setters Em Python não usamos muitos getters e setters dessa forma. Para controlar acesso usamos properties. Wednesday, November 2, 2011
  • 8. OO em Python se parece com... herança múltipla, como C++ sobrecarga de operadores, como C++ não obriga a criar classes, como C++ tipagem dinâmica, como Smalltalk e Ruby tipagem dinâmica, mas não tipagem fraca Wednesday, November 2, 2011
  • 9. O que é tipagem fraca? conversão automática entre tipos comum em linguagens de scripting (JavaScript, Perl, PHP) uma fonte de bugs difíceis de localizar e tratar ◀ "9" + 10 ▶ "910" Exemplos reais digitados -- ◀ "9" * 10 no console JavaScript do ▶ 90 Firefox 6.0 -- ◀ "9" - 10 ▶ -1 -- Atenção: Python ◀ "9" + (-10) ▶ "9-10" não é assim! Wednesday, November 2, 2011
  • 10. Tipagem dinâmica Variáveis (e parâmetros) não têm tipos declarados e podem ser associados a objetos de qualquer tipo em tempo de execução Também conhecida como “duck typing” (tipagem pato) nas comunidades Python, Ruby e Smalltalk >>> def dobro(n): ... '''devolve duas vezes n''' ... return n + n ... >>> dobro(7) 14 >>> dobro('Spam') 'SpamSpam' >>> dobro([10, 20, 30]) [10, 20, 30, 10, 20, 30] Wednesday, November 2, 2011
  • 11. Tipagem dinâmica forte Python não faz conversão automática de tipos exceções, por praticidade: int → long → float str → unicode >>> "9" + 10 TypeError: cannot concatenate 'str' and 'int' objects >>> "9" * 10 '9999999999' >>> "9" - 10 TypeError: unsupported operand type(s) for -: 'str' and 'int' >>> "9" + (-10) TypeError: cannot concatenate 'str' and 'int' objects Wednesday, November 2, 2011
  • 12. Para quem conhece Java Python não tem interfaces mas tem herança múltipla e classes abstratas Python não tem sobrecarga de métodos mas tem sobrecarga de operadores e passagem de argumentos flexível Python não tem tipos primitivos tudo é objeto (desde Python 2.2, dez/2001) >>> 5 .__add__(3) 8 Wednesday, November 2, 2011
  • 13. Ex: 5 é uma instância de int >>> 5 .__add__(3) 8 >>> type(5) atributos de int <type 'int'> >>> dir(5) ['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'conjugate', 'denominator', 'imag', 'numerator', 'real'] Wednesday, November 2, 2011
  • 14. Sintaxe de classes Wednesday, November 2, 2011
  • 15. Classe com 3 métodos class Contador(object): def __init__(this): this.contagem = {} def incluir(this, item): qtd = this.contagem.get(item, 0) + 1 this.contagem[item] = qtd def contar(this, item): return this.contagem[item] Wednesday, November 2, 2011
  • 16. Classe com 3 métodos class Contador(object): def __init__(this): não usamos this.contagem = {} this def incluir(this, item): qtd = this.contagem.get(item, 0) + 1 this.contagem[item] = qtd def contar(this, item): return this.contagem[item] Wednesday, November 2, 2011
  • 17. Classe com 3 métodos class Contador(object): def __init__(self): usamos self.contagem = {} self def incluir(self, item): qtd = self.contagem.get(item, 0) + 1 self.contagem[item] = qtd def contar(self, item): return self.contagem[item] Wednesday, November 2, 2011
  • 18. Peculiaridade: self explícito Todos os métodos de instâncias devem declarar o self como primeiro parâmetro Todos os acessos a atributos (inclusive métodos) das instâncias devem ser feitos via referência explícita a self class Contador(object): def __init__(self): self.contagem = {} def incluir(self, item): qtd = self.contagem.get(item, 0) + 1 self.contagem[item] = qtd Wednesday, November 2, 2011
  • 19. Ex: uso da classe Contador não existe o >>> cont = Contador() >>> palavra = 'abacaxi' operador new >>> for letra in palavra: ... cont.incluir(letra) ... >>> for letra in sorted(set(pal)): ... print letra, cont.contar(letra) ... a 3 b 1 c 1 i 1 x 1 Wednesday, November 2, 2011
  • 20. Convenções classes devem herdar de object ou de outras classes que herdam de object classes antigas (‘old style’) não seguem essa regra não existem mais classes antigas em Python 3 construtor deve se chamar __new__ (uso raro) inicializador deve se chamar __init__ (uso comum) o __init__ faz o papel do que chamamos de construtor em outras linguagens Wednesday, November 2, 2011
  • 21. __init__ versus __new__ __init__ recebe uma instância já construída, e sua função é incializar os atributos da instância isso é o mesmo que acontece em Java! Em Python temos mais controle: podemos sobrescrever o método __new__ da classe para interferir no processo de construção da instância na prática é bem raro implementarmos __new__ técnica avançada de meta-programação Wednesday, November 2, 2011
  • 22. Instâncias abertas instâncias podem receber atributos dinamicamente por isso às vezes é útil criar classes vazias não muito comum Wednesday, November 2, 2011
  • 23. Exemplo: classe vazia >>> class Animal(object): pass serve para ... pass ... criar blocos vazios >>> baleia = Animal() >>> baleia.nome Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Animal' object has no attribute 'nome' >>> baleia.nome = 'Moby Dick' >>> baleia.peso = 1200 >>> print '{0.nome} ({0.peso:.1f})'.format(baleia) Moby Dick (1200.0) Wednesday, November 2, 2011
  • 24. Classes abertas? Em Ruby as classes são “abertas”, a sintaxe comum permite que um módulo redefina uma classe e adicione atributos a uma classe definida em outro módulo É uma violação do princípio “Open Closed” (SOLID) “entidades de software (classes, módulos, funções etc.) devem ser abertas para extensão mas fechadas para modificação” (Bertrand Meyer, OO Sw. Construction) Em Python isso é chamado de “monkey patching”, usa uma sintaxe de reflexão explícita e não é considerada uma boa prática (mas acontece) Wednesday, November 2, 2011
  • 25. Atributos de classe × de instância >>> class Animal(object): atributo da classe ... nome = 'Rex' ... >>> cao = Animal() atributo encontrado >>> cao.nome 'Rex' na classe >>> cao.nome = 'Fido' >>> cao.nome 'Fido' atributo criado >>> Animal.nome na instanncia 'Rex' >>> dino = Animal() >>> dino.nome nada mudou na classe 'Rex' Wednesday, November 2, 2011
  • 26. Métodos de classe/estáticos Indicados por decoradores de função class Exemplo(object): @classmethod def da_classe(cls, arg): return (cls, arg) @staticmethod def estatico(arg): return arg >>> Exemplo.da_classe('fu') (<class '__main__.Exemplo'>, 'fu') >>> Exemplo.estatico('bar') 'bar' Wednesday, November 2, 2011
  • 27. Herança no exemplo abaixo, ContadorTolerante extende Contador o método contar está sendo sobrescrito class Contador(object): os métodos __init__ e def __init__(self): self.contagem = {} incluir são herdados def incluir(self, item): qtd = self.contagem.get(item, 0) + 1 self.contagem[item] = qtd def contar(self, item): return self.contagem[item] class ContadorTolerante(Contador): def contar(self, item): return self.contagem.get(item, 0) Wednesday, November 2, 2011
  • 28. Invocar método de super-classe A forma mais simples: class ContadorTotalizador(Contador): def __init__(self): Contador.__init__(self) self.total = 0 def incluir(self, item): Contador.incluir(self, item) self.total += 1 Wednesday, November 2, 2011
  • 29. Invocar método de super-classe A forma mais correta: 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 Wednesday, November 2, 2011
  • 30. Herança múltipla classe que totaliza e não levanta exceções: class ContadorTT(ContadorTotalizador, ContadorTolerante): pass como funciona: MRO = ordem de resolução de métodos >>> ContadorTT.__mro__ (<class '__main__.ContadorTT'>, <class '__main__.ContadorTotalizador'>, <class '__main__.ContadorTolerante'>, <class '__main__.Contador'>, <type 'object'>) Wednesday, November 2, 2011
  • 31. Uso de herança múltipla >>> from contadores import * >>> class ContadorTT(ContadorTotalizador, ... ContadorTolerante): ... pass ... >>> ctt = ContadorTT() >>> for letra in 'abacaxi': ... ctt.incluir(letra) ... >>> ctt.total 7 >>> ctt.contar('a') 3 >>> ctt.contar('z') 0 Wednesday, November 2, 2011
  • 32. Encapsulamento Propriedades: encapsulamento para quem precisa de encapsulamento >>> a = C() violação de >>> a.x = 10 encapsulamento? >>> print a.x 10 >>> a.x = -10 >>> print a.x pergunte-me 0 como! Wednesday, November 2, 2011
  • 33. 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) Wednesday, November 2, 2011
  • 34. 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) Wednesday, November 2, 2011
  • 35. 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 Wednesday, November 2, 2011
  • 36. 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 Wednesday, November 2, 2011
  • 37. Polimorfismo: definição O conceito de “polimorfismo” significa que podemos tratar instâncias de diferentes classes da mesma maneira. Assim, podemos enviar uma mensagem a um objeto sem saber de antemão qual é o seu tipo, e o objeto ainda assim fará “a coisa certa”, pelo menos do seu ponto de vista. Scott Ambler - The Object Primer, 2nd ed. - p. 173 Wednesday, November 2, 2011
  • 38. Polimorfismo Fatiamento e len listas e strings são sequências >>> l = [1, 2, 3] >>> l[:2] [1, 2] >>> 'casa'[:2] 'ca' >>> len(l) 3 >>> len('casa') 4 Wednesday, November 2, 2011
  • 39. Polimorfismo >>> s = 'Python: simples e correta' >>> for letra in s[:6]: print letra P y t h o n >>> for letra in reversed(s): print letra ... a t e r r o c Wednesday, November 2, 2011
  • 40. Polimorfismo >>> l = range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l[0] 0 >>> l[-1] 9 >>> l[:3] [0, 1, 2] >>> for n in reversed(l): print n ... 9 8 7 6 5 4 3 Wednesday, November 2, 2011
  • 41. Exemplo: baralho polimórfico começamos com uma classe bem simples: class Carta(object): def __init__(self, valor, naipe): self.valor = valor self.naipe = naipe def __repr__(self): return '<%s de %s>' % (self.valor, self.naipe) Wednesday, November 2, 2011
  • 42. Baralho polimórfico 2 métodos especiais: __len__, __getitem__` com esses métodos, Baralho implementa o protocolo das sequências imutáveis class Baralho(object): naipes = 'paus copas espadas ouros'.split() valores = 'A 2 3 4 5 6 7 8 9 10 J Q K'.split() def __init__(self): self.cartas = [Carta(v, n) for n in self.naipes for v in self.valores] def __len__(self): return len(self.cartas) def __getitem__(self, pos): return self.cartas[pos] Wednesday, November 2, 2011
  • 43. Baralho polimórfico 3 >>> from baralho import Baralho >>> b = Baralho() >>> len(b) 52 >>> b[0], b[1], b[2] (<A de paus>, <2 de copas>, <3 de copas>) >>> for carta in reversed(b): print carta ... <K de ouros> <Q de ouros> <J de ouros> <10 de ouros> <9 de ouros> <8 de ouros> <7 de ouros> <6 de ouros> <5 de ouros> Wednesday, November 2, 2011
  • 44. Baralho polimórfico 4 >>> from baralho import Baralho >>> b = Baralho() >>> len(b) 52 >>> b[:3] [<A de paus>, <2 de paus>, <3 de paus>] >>> from random import choice >>> for i in range(5): print choice(b) ... <Q de copas> <4 de ouros> a mesma carta pode <A de copas> sair duas vezes! <5 de ouros> <9 de paus> >>> for i in range(5): print choice(b) ... <3 de paus> <9 de copas> Wednesday, November 2, 2011
  • 45. Baralho polimórfico 5 >>> from random import shuffle Python vem com >>> l = range(10) >>> l pilhas incluídas! [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> shuffle(l) >>> l [7, 6, 3, 2, 9, 5, 0, 4, 1, 8] >>> shuffle(b) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/ Versions/2.6/lib/python2.6/random.py", line 275, in shuffle x[i], x[j] = x[j], x[i] TypeError: 'Baralho' object does not support item assignment ooops... Wednesday, November 2, 2011
  • 46. Baralho polimórfico 6 monkey- >>> def meu_setitem(self, pos, valor): patch ... self.cartas[pos] = valor ... >>> Baralho.__setitem__ = meu_setitem >>> shuffle(b) agora >>> b[:5] funciona! [<J de espadas>, <Q de paus>, <2 de paus>, <6 de paus>, <A de espadas>] >>> Wednesday, November 2, 2011
  • 47. Baralho polimórfico 7 fazendo direito (sem monkey-patch) class Baralho(object): naipes = 'paus copas espadas ouros'.split() valores = 'A 2 3 4 5 6 7 8 9 10 J Q K'.split() def __init__(self): self.cartas = [Carta(v, n) for n in self.naipes for v in self.valores] def __len__(self): return len(self.cartas) def __getitem__(self, pos): return self.cartas[pos] def __setitem__(self, pos, item): self.cartas[pos] = item Wednesday, November 2, 2011
  • 48. Academia Python instrutor: Luciano Ramalho 112 horas/aula, 3½ meses !"!#$%&!'()*+,- COM LUCIANO RAMALHO 5 módulos A Academia Python dá uma visão acessível e prática da linguagem: principais bibliotecas, desenvolvimento Web com Django, receitas para tarefas comuns, ! programação Orientada a Objetos e multi-paradigma e testes automatizados. ! As academias da Globalcode são formações completas compostas por vários ! Introdução à linguagem módulos com muito mais tempo para os alunos interagirem com os instrutores. ! ! A Academia Python tem cinco módulos totalizando 112 horas aula. É fruto da ! união entre a qualidade e metodologia da Globalcode e a experiência e OO e frameworks conhecimento do Luciano Ramalho. Módulos da Academia Python: PY1 - Introdução à linguagem Python Django + Jquery PY2 - Orientação a Objetos e frameworks PY3 - Desenvolvimento Web com Django e JQuery PY4 - Django pro ssional Django profissional PY5 - Cloud, NoSQL e novas arquiteturas @luciano !"#$%&'()%*+),%-.',%/'*0 Mais informações: Cloud, NoSQL etc. !"#$%&'()%*+),%-./,%0/*12 2!""#$%"&'())%* Wednesday, November 2, 2011