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

Introduction to python
Introduction to pythonIntroduction to python
Introduction to pythonYi-Fan Chu
 
Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)Paige Bailey
 
Arrays (vetores) em Java
Arrays (vetores) em JavaArrays (vetores) em Java
Arrays (vetores) em JavaDaniel Brandão
 
Introduction To Python
Introduction To PythonIntroduction To Python
Introduction To PythonVanessa Rene
 
Logica programacao python-slides
Logica programacao python-slidesLogica programacao python-slides
Logica programacao python-slidesronaldo ramos
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python Andreas Schreiber
 
Operators and Control Statements in Python
Operators and Control Statements in PythonOperators and Control Statements in Python
Operators and Control Statements in PythonRajeswariA8
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815Yong Joon Moon
 
Encapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonEncapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonLuciano Ramalho
 
Estrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem CEstrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem CAdriano Teixeira de Souza
 
Data Analysis and Visualization using Python
Data Analysis and Visualization using PythonData Analysis and Visualization using Python
Data Analysis and Visualization using PythonChariza Pladin
 
Python GUI Programming
Python GUI ProgrammingPython GUI Programming
Python GUI ProgrammingRTS Tech
 
Introdução ao Python
Introdução ao PythonIntrodução ao Python
Introdução ao PythonMarcio Palheta
 
Apresentação python fábio jr alves
Apresentação python   fábio jr alvesApresentação python   fábio jr alves
Apresentação python fábio jr alvesGrupython Ufla
 
Introduction to Python programming
Introduction to Python programmingIntroduction to Python programming
Introduction to Python programmingDamian T. Gordon
 
機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動Hideto Ogawa
 

Mais procurados (20)

Introduction to python
Introduction to pythonIntroduction to python
Introduction to python
 
Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)
 
Arrays (vetores) em Java
Arrays (vetores) em JavaArrays (vetores) em Java
Arrays (vetores) em Java
 
Introduction To Python
Introduction To PythonIntroduction To Python
Introduction To Python
 
Logica programacao python-slides
Logica programacao python-slidesLogica programacao python-slides
Logica programacao python-slides
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python
 
Operators and Control Statements in Python
Operators and Control Statements in PythonOperators and Control Statements in Python
Operators and Control Statements in Python
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815
 
Encapsulamento com Descritores em Python
Encapsulamento com Descritores em PythonEncapsulamento com Descritores em Python
Encapsulamento com Descritores em Python
 
Comandos em python
Comandos em pythonComandos em python
Comandos em python
 
Python
PythonPython
Python
 
Estrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem CEstrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem C
 
Python
PythonPython
Python
 
Data Analysis and Visualization using Python
Data Analysis and Visualization using PythonData Analysis and Visualization using Python
Data Analysis and Visualization using Python
 
Python GUI Programming
Python GUI ProgrammingPython GUI Programming
Python GUI Programming
 
Introdução ao Python
Introdução ao PythonIntrodução ao Python
Introdução ao Python
 
Apresentação python fábio jr alves
Apresentação python   fábio jr alvesApresentação python   fábio jr alves
Apresentação python fábio jr alves
 
Introduction to Python programming
Introduction to Python programmingIntroduction to Python programming
Introduction to Python programming
 
Python Basics
Python BasicsPython Basics
Python Basics
 
機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動
 

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 PythonCarlos 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çõesMarcos Thomaz
 
Python e Django na Globo.com
Python e Django na Globo.comPython e Django na Globo.com
Python e Django na Globo.comricobl
 
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
 
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.comAlexandre Saboia Fuziyama
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano 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 PythonOsvaldo Santana Neto
 
Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!Juliano Atanazio
 
Por que Python? - PythonBrasil[5] - 2009
Por que Python? - PythonBrasil[5] - 2009Por que Python? - PythonBrasil[5] - 2009
Por que Python? - PythonBrasil[5] - 2009Marco Mendes
 
Classificação da informação
Classificação da informaçãoClassificação da informação
Classificação da informaçãoFernando Palma
 
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 djangoIgor Sobreira
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
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 BrasilMarcel 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 2011Luciano Ramalho
 
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
 
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
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução BásicaChristian Perone
 
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
 

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

Mais de 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 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
 
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
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sérioLuciano Ramalho
 
Porque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitosPorque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitosLuciano 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
 
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
 
Porque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitosPorque bibliotecários usam bancos de dados esquisitos
Porque bibliotecários usam bancos de dados esquisitos
 

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