orientação a objeto em python

Upload: thoomaswill

Post on 27-Feb-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/25/2019 Orientao a objeto em Python

    1/48

    Introduo

    Orientao a Objetosem Python (sem sotaque)

    Luciano Ramalho

    [email protected], November 2, 2011

    mailto:[email protected]:[email protected]
  • 7/25/2019 Orientao a objeto em Python

    2/48

    Saiu em uma revista...

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    3/48

    Python

    comsotaque

    javans

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    4/48

    Nouse;no finaldas linhas

    No um errosinttico, mas desnecessrioe portanto

    deseleganteWednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    5/48

    Esses

    nosomtodos

    da classeEsses mtodosagem sobre as

    instncias (noteo self). Mtodosde classe sodecorados com

    @classmethod.Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    6/48

    No

    abusedegetters e

    settersEm Python nousamos muitos

    getters e settersdessa forma.Para controlaracesso usamos

    properties.Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    7/48

    Caractersticas bsicas

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    8/48

    OO em Python se

    parece com...herana mltipla, como C++

    sobrecarga de operadores, como C++

    no obriga a criar classes, como C++

    tipagem dinmica, como Smalltalk e Ruby

    tipagem dinmica, mas no tipagem fraca

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    9/48

    O que tipagem fraca?converso automtica entre tipos

    comum em linguagens de scripting (JavaScript, Perl, PHP)

    uma fonte de bugs difceis de localizar e tratar

    !"9" + 10""910"--!"9" * 10

    "90--!"9" - 10"-1--!"9" + (-10)

    ""9-10"

    Ateno: Python

    no assim!Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    10/48

    Tipagem dinmicaVariveis (e parmetros) no tm tipos declarados epodem ser associados a objetos de qualquer tipoem tempo de execuo

    Tambm conhecida como duck typing (tipagempato) 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

  • 7/25/2019 Orientao a objeto em Python

    11/48

    Tipagem dinmica forte

    Python no faz converso automtica de tipos

    excees, por praticidade:

    >>> "9" + 10TypeError: cannot concatenate 'str' and 'int' objects>>> "9" * 10'9999999999'

    >>> "9" - 10TypeError: unsupported operand type(s) for -: 'str'and 'int'>>> "9" + (-10)TypeError: cannot concatenate 'str' and 'int' objects

    int!long!float

    str!unicode

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    12/48

    Para quem conhece Java

    Python no tem interfaces

    mas tem herana mltipla e classes abstratas

    Python no tem sobrecarga de mtodosmas tem sobrecarga de operadores e passagem deargumentos flexvel

    Python no tem tipos primitivostudo objeto (desde Python 2.2, dez/2001)

    >>> 5 .__add__(3)8

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    13/48

    Ex: 5 uma instncia de int>>> 5 .__add__(3)8>>> type(5)>>> 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

  • 7/25/2019 Orientao a objeto em Python

    14/48

    Sintaxe de classes

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    15/48

    Classe com 3 mtodos

    classContador(object):

    def__init__(this):

    this.contagem ={}

    defincluir(this, item):

    qtd =this.contagem.get(item, 0) +1

    this.contagem[item] =qtd

    defcontar(this, item):

    returnthis.contagem[item]

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    16/48

    Classe com 3 mtodos

    classContador(object):

    def__init__(this):

    this.contagem ={}

    defincluir(this, item):

    qtd =this.contagem.get(item, 0) +1

    this.contagem[item] =qtd

    defcontar(this, item):

    returnthis.contagem[item]

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    17/48

    Classe com 3 mtodos

    classContador(object):

    def__init__(self):

    self.contagem ={}

    defincluir(self, item):

    qtd =self.contagem.get(item, 0) +1

    self.contagem[item] =qtd

    defcontar(self, item):

    returnself.contagem[item]

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    18/48

    Peculiaridade: self explcito

    Todos os mtodos de instncias devem declarar o selfcomo primeiro parmetro

    Todos os acessos a atributos (inclusive mtodos) dasinstncias devem ser feitos via referncia explcita a self

    classContador(object):

    def__init__(self): self.contagem ={}

    defincluir(self, item):

    qtd =self.contagem.get(item, 0) +1

    self.contagem[item] =qtd

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    19/48

    Ex: uso da classe Contador

    >>> cont = Contador()>>> palavra = 'abacaxi'>>> for letra in palavra:

    ... cont.incluir(letra)...>>> for letra in sorted(set(pal)):... print letra, cont.contar(letra)...

    a 3b 1c 1i 1x 1

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    20/48

    Convenes

    classes devem herdar de objectou de outras classesque herdam de object

    classes antigas (old style) no seguem essa regrano 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 construtorem outras linguagens

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    21/48

    __init__versus __new__

    __init__recebe uma instncia j construda, e suafuno incializar os atributos da instncia

    isso o mesmo que acontece em Java!

    Em Python temos mais controle: podemossobrescrever o mtodo __new__da classe para

    interferir no processo de construo da instnciana prtica bem raro implementarmos __new__

    tcnica avanada de meta-programao

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    22/48

    Instncias abertas

    instncias podem receber atributos dinamicamente

    por isso s vezes til criar classes vazias

    no muito comum

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    23/48

    Exemplo: classe vazia

    >>> class Animal(object):... pass...

    >>> baleia = Animal()>>> baleia.nomeTraceback (most recent call last): File "", line 1, in 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

  • 7/25/2019 Orientao a objeto em Python

    24/48

    Classes abertas?

    Em Ruby as classes so abertas, a sintaxe comumpermite que um mdulo redefina uma classe e adicioneatributos a uma classe definida em outro mdulo

    uma violao do princpio Open Closed (SOLID)

    entidades de software (classes, mdulos, funes etc.)devem ser abertas para extenso mas fechadas para

    modificao (Bertrand Meyer, OO Sw. Construction)Em Python isso chamado de monkey patching, usauma sintaxe de reflexo explcita e no considerada uma boa prtica (mas acontece)

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    25/48

    Atributos

    de classe !de instncia>>> class Animal(object):... nome = 'Rex'...>>> cao = Animal()>>> cao.nome'Rex'>>> cao.nome = 'Fido'

    >>> cao.nome'Fido'>>> Animal.nome'Rex'>>> dino = Animal()>>> dino.nome'Rex'

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    26/48

    Mtodos de classe/estticos

    Indicados por decoradores de funo

    classExemplo(object):

    @classmethod defda_classe(cls, arg):

    return(cls, arg)

    @staticmethod

    defestatico(arg):

    returnarg

    >>> Exemplo.da_classe('fu')(, 'fu')>>> Exemplo.estatico('bar')

    'bar'Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    27/48

    Herana

    no exemplo abaixo, ContadorToleranteextende Contador

    o mtodo contarest sendo sobrescrito

    os mtodos __init__eincluirso herdados

    classContador(object):

    def__init__(self):

    self.contagem ={}

    defincluir(self, item):

    qtd =self.contagem.get(item, 0) +1

    self.contagem[item] =qtd

    defcontar(self, item):

    returnself.contagem[item]

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    28/48

    Invocar mtodo desuper-classe

    A forma mais simples:

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    29/48

    Invocar mtodo desuper-classe

    A forma mais correta:

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    30/48

    Herana mltipla

    classe que totaliza e no levanta excees:

    como funciona:

    MRO = ordem de resoluo de mtodos

    >>> ContadorTT.__mro__(,,,,

    )Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    31/48

    Uso de herana mltipla

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

  • 7/25/2019 Orientao a objeto em Python

    32/48

    Encapsulamento

    Propriedades:

    encapsulamento para quem precisa de

    encapsulamento>>> a = C()>>> a.x = 10>>> print a.x

    10>>> a.x = -10>>> print a.x0

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    33/48

    Propriedade: implementao

    apenas para leitura, via decorator:

    a notao __xprotege o atributo contra acessosacidentais (__x= dois underscores esquerda)

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    34/48

    Propriedade: implementao 2

    para leitura e escrita (Python >= 2.2):

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    35/48

    Propriedade: implementao 3

    para leitura e escrita (Python >= 2.6):

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    36/48

    Propriedade: exemplo de uso

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    37/48

    Polimorfismo: definioO conceito de polimorfismo significa que podemos tratarinstncias de diferentes classes da mesma maneira.

    Assim, podemos enviar uma mensagem a um objeto semsaber de antemo qual o seu tipo, e o objeto ainda assimfar a coisa certa, pelo menos do seu ponto de vista.

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

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    38/48

    Polimorfismo

    Fatiamento e len

    listas e strings so sequncias

    >>> l = [1, 2, 3]>>> l[:2][1, 2]>>> 'casa'[:2]'ca'

    >>> len(l)3>>> len('casa')4

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    39/48

    Polimorfismo

    >>> s = 'Python: simples e correta'>>> for letra in s[:6]: print letraPy

    thon>>> for letra in reversed(s): print letra...aterr

    oWednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    40/48

    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...98765

    4Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    41/48

    Exemplo: baralho polimrfico

    comeamos com uma classe bem simples:

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    42/48

    Baralho polimrfico 2mtodos especiais: __len__, __getitem__`

    com esses mtodos, Baralho implementa oprotocolo das sequncias imutveis

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    43/48

    Baralho polimrfico 3

    >>> from baralho import Baralho>>> b = Baralho()>>> len(b)52

    >>> b[0], b[1], b[2](, , )>>> for carta in reversed(b): print carta...

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    44/48

    Baralho polimrfico 4>>> from baralho import Baralho>>> b = Baralho()>>> len(b)52>>> b[:3]

    [, , ]>>> from random import choice>>> for i in range(5): print choice(b)...>>> for i in range(5): print choice(b)...

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    45/48

    Baralho polimrfico 5>>> from random import shuffle>>> l = range(10)>>> l[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 "", line 1, in File "/System/Library/Frameworks/Python.framework/

    Versions/2.6/lib/python2.6/random.py", line 275, inshuffle x[i], x[j] = x[j], x[i]TypeError: 'Baralho' object does not support itemassignment

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    46/48

    Baralho polimrfico 6

    >>> def meu_setitem(self, pos, valor):... self.cartas[pos] = valor...>>> Baralho.__setitem__ = meu_setitem>>> shuffle(b)>>> b[:5][, , ,, ]

    >>>

    Wednesday, November 2, 2011

  • 7/25/2019 Orientao a objeto em Python

    47/48

    Baralho polimrfico 7

    fazendo direito (sem monkey-patch)

    Wednesday, November 2, 2011

    Academia

  • 7/25/2019 Orientao a objeto em Python

    48/48

    AcademiaPython

    instrutor: Luciano Ramalho

    112 horas/aula, 3"meses

    5 mdulosIntroduo linguagem

    OO e frameworks

    Django + Jquery

    Django profissional

    Cl d N SQL t