SlideShare uma empresa Scribd logo
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

Gstreamer plugin development
Gstreamer plugin development Gstreamer plugin development
Gstreamer plugin development
NEEVEE Technologies
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
Daniel Brandão
 
Apresentação HTML e CSS
Apresentação HTML e CSSApresentação HTML e CSS
Apresentação HTML e CSS
ledsifes
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
Priscila Mayumi
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
Paulo Dayvson
 
Java modulo 01 - Introdução
Java modulo 01 - IntroduçãoJava modulo 01 - Introdução
Java modulo 01 - Introdução
Professor Samuel Ribeiro
 
Python Workshop
Python WorkshopPython Workshop
Python Workshop
Saket Choudhary
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
Marcio Marinho
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
Denis L Presciliano
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
Rodrigo Branas
 
Algoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigoAlgoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigo
Mauro Pereira
 
Introdução ao Python
Introdução ao PythonIntrodução ao Python
Introdução ao Python
Marcio Palheta
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
Gabriel Moura
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
Karen Costa
 
Introdução ao desenvolvimento Web
Introdução ao desenvolvimento WebIntrodução ao desenvolvimento Web
Introdução ao desenvolvimento Web
Sérgio Souza Costa
 
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
 
Curso de css3 unidade 1 - introdução ao css
Curso de css3   unidade 1 - introdução ao cssCurso de css3   unidade 1 - introdução ao css
Curso de css3 unidade 1 - introdução ao css
Léo Dias
 
Cap1 exercicios comandos linux
Cap1 exercicios comandos linuxCap1 exercicios comandos linux
Cap1 exercicios comandos linux
portal_Do_estudante
 
BD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
BD I - Aula 08 B - Algebra Relacional - Exercicios ResolucaoBD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
BD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
Rodrigo Kiyoshi Saito
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
Luciano Ramalho
 

Mais procurados (20)

Gstreamer plugin development
Gstreamer plugin development Gstreamer plugin development
Gstreamer plugin development
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
Apresentação HTML e CSS
Apresentação HTML e CSSApresentação HTML e CSS
Apresentação HTML e CSS
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
 
Java modulo 01 - Introdução
Java modulo 01 - IntroduçãoJava modulo 01 - Introdução
Java modulo 01 - Introdução
 
Python Workshop
Python WorkshopPython Workshop
Python Workshop
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 
Algoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigoAlgoritmos e lp parte3-pseudocódigo
Algoritmos e lp parte3-pseudocódigo
 
Introdução ao Python
Introdução ao PythonIntrodução ao Python
Introdução ao Python
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
 
Introdução ao desenvolvimento Web
Introdução ao desenvolvimento WebIntrodução ao desenvolvimento Web
Introdução ao desenvolvimento Web
 
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)
 
Curso de css3 unidade 1 - introdução ao css
Curso de css3   unidade 1 - introdução ao cssCurso de css3   unidade 1 - introdução ao css
Curso de css3 unidade 1 - introdução ao css
 
Cap1 exercicios comandos linux
Cap1 exercicios comandos linuxCap1 exercicios comandos linux
Cap1 exercicios comandos linux
 
BD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
BD I - Aula 08 B - Algebra Relacional - Exercicios ResolucaoBD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
BD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 

Destaque

Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação Python
Carlos Schults
 
Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas AplicaçõesPalestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas Aplicações
Marcos Thomaz
 
Python e Django na Globo.com
Python e Django na Globo.comPython e Django na Globo.com
Python e Django na Globo.com
ricobl
 
python.ppt
python.pptpython.ppt
python.ppt
shreyas_test_1234
 
WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?
WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?
WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?
Humberto Diógenes
 
Canivete suíço do Python
Canivete suíço do PythonCanivete suíço do Python
Canivete suíço do Python
Douglas Soares de Andrade
 
O CartolaFC e o processo de desenvolvimento na globo.com
O CartolaFC e o processo de desenvolvimento na globo.comO CartolaFC e o processo de desenvolvimento na globo.com
O CartolaFC e o processo de desenvolvimento na globo.com
Alexandre Saboia Fuziyama
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
Luciano Ramalho
 
Matando o Java e Mostrando o Python
Matando o Java e Mostrando o PythonMatando o Java e Mostrando o Python
Matando o Java e Mostrando o Python
Osvaldo Santana Neto
 
Python 01
Python 01Python 01
Python 01
Bruno Catão
 
Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!
Juliano Atanazio
 
Introducao python 2010
Introducao python 2010Introducao python 2010
Introducao python 2010
Eduardo S. Pereira
 
Por que Python? - PythonBrasil[5] - 2009
Por que Python? - PythonBrasil[5] - 2009Por que Python? - PythonBrasil[5] - 2009
Por que Python? - PythonBrasil[5] - 2009
Marco Mendes
 
Classificação da informação
Classificação da informaçãoClassificação da informação
Classificação da informação
Fernando Palma
 
Porque Python?
Porque Python?Porque Python?
Porque Python?
Marco Mendes
 
Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?
Marcel Caraciolo
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
Igor Sobreira
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
Rafael Cassau
 
Python for zombies (very basic level)
Python for zombies (very basic level)Python for zombies (very basic level)
Python for zombies (very basic level)
FATEC São José dos Campos
 
Como Python está mudando a forma de aprendizagem à distância no Brasil
Como Python está mudando a forma de aprendizagem à distância no BrasilComo Python está mudando a forma de aprendizagem à distância no Brasil
Como Python está mudando a forma de aprendizagem à distância no Brasil
Marcel Caraciolo
 

Destaque (20)

Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação Python
 
Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas AplicaçõesPalestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas Aplicações
 
Python e Django na Globo.com
Python e Django na Globo.comPython e Django na Globo.com
Python e Django na Globo.com
 
python.ppt
python.pptpython.ppt
python.ppt
 
WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?
WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?
WSGI: a resposta para a questão definitiva sobre Python, a web e tudo mais?
 
Canivete suíço do Python
Canivete suíço do PythonCanivete suíço do Python
Canivete suíço do Python
 
O CartolaFC e o processo de desenvolvimento na globo.com
O CartolaFC e o processo de desenvolvimento na globo.comO CartolaFC e o processo de desenvolvimento na globo.com
O CartolaFC e o processo de desenvolvimento na globo.com
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Matando o Java e Mostrando o Python
Matando o Java e Mostrando o PythonMatando o Java e Mostrando o Python
Matando o Java e Mostrando o Python
 
Python 01
Python 01Python 01
Python 01
 
Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!
 
Introducao python 2010
Introducao python 2010Introducao python 2010
Introducao python 2010
 
Por que Python? - PythonBrasil[5] - 2009
Por que Python? - PythonBrasil[5] - 2009Por que Python? - PythonBrasil[5] - 2009
Por que Python? - PythonBrasil[5] - 2009
 
Classificação da informação
Classificação da informaçãoClassificação da informação
Classificação da informação
 
Porque Python?
Porque Python?Porque Python?
Porque Python?
 
Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Python for zombies (very basic level)
Python for zombies (very basic level)Python for zombies (very basic level)
Python for zombies (very basic level)
 
Como Python está mudando a forma de aprendizagem à distância no Brasil
Como Python está mudando a forma de aprendizagem à distância no BrasilComo Python está mudando a forma de aprendizagem à distância no Brasil
Como Python está mudando a forma de aprendizagem à distância no Brasil
 

Semelhante a OO em Python sem sotaque

Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011
Luciano Ramalho
 
Introducao ao python - Luciana Mota
Introducao ao python - Luciana MotaIntroducao ao python - Luciana Mota
Introducao ao python - Luciana Mota
lucianacmota
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
Luciano 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 d2
Moises 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 Python
Alvaro Oliveira
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
wildcat9335
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução Básica
Christian Perone
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em Python
Rober Guerra
 
Aula python
Aula pythonAula python
Slide_Python.pdf
Slide_Python.pdfSlide_Python.pdf
Slide_Python.pdf
HevertonSCosta
 
Dinamicas
DinamicasDinamicas
Dinamicas
Ialis Cavalcante
 
Python: programação divertida novamente
Python: programação divertida novamentePython: programação divertida novamente
Python: programação divertida novamente
Rodrigo Amaral
 
aula3_python.pptx
aula3_python.pptxaula3_python.pptx
aula3_python.pptx
ClaudetedeS1
 
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 objetos
Felipe 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 sintaxe
Flapenta
 
apresentacao.pdf
apresentacao.pdfapresentacao.pdf
apresentacao.pdf
EduardoChicoJooJoo
 
Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
Julio Cesar Eiras Melanda
 

Semelhante a OO em Python sem sotaque (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
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução Básica
 
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
 

Mais de Luciano Ramalho

Wiki-wiki S/A
Wiki-wiki S/AWiki-wiki S/A
Wiki-wiki S/A
Luciano Ramalho
 
Mongodb: agregação
Mongodb: agregaçãoMongodb: agregação
Mongodb: agregação
Luciano 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 descritores
Luciano Ramalho
 
Iteraveis e geradores
Iteraveis e geradoresIteraveis e geradores
Iteraveis e geradores
Luciano Ramalho
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojo
Luciano Ramalho
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
Luciano Ramalho
 
Encapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonEncapsulamento com Descritores em Python
Encapsulamento com Descritores em Python
Luciano Ramalho
 
Dojo com Processing
Dojo com ProcessingDojo com Processing
Dojo com Processing
Luciano Ramalho
 
Dojo com Arduino
Dojo com ArduinoDojo com Arduino
Dojo com Arduino
Luciano Ramalho
 
Open Library no Mongodb
Open Library no MongodbOpen Library no Mongodb
Open Library no Mongodb
Luciano Ramalho
 
Modelos ricos
Modelos ricosModelos ricos
Modelos ricos
Luciano Ramalho
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
Luciano Ramalho
 
Ensinando OO com Python
Ensinando OO com PythonEnsinando OO com Python
Ensinando OO com Python
Luciano Ramalho
 
Alex Martelli's Python Design Patterns
Alex Martelli's Python Design PatternsAlex Martelli's Python Design Patterns
Alex Martelli's Python Design Patterns
Luciano Ramalho
 
Dspace em 5 minutos
Dspace em 5 minutosDspace em 5 minutos
Dspace em 5 minutos
Luciano 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
 
Wiki sa-v2
Wiki sa-v2Wiki sa-v2
Wiki sa-v2
Luciano Ramalho
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
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
 
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
 
Encapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonEncapsulamento com Descritores em Python
Encapsulamento com Descritores 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
 
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
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
 

OO em Python sem sotaque

  • 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