orientação a objeto em python
Post on 27-Feb-2018
221 Views
Preview:
TRANSCRIPT
-
7/25/2019 Orientao a objeto em Python
1/48
Introduo
Orientao a Objetosem Python (sem sotaque)
Luciano Ramalho
luciano@ramalho.orgWednesday, November 2, 2011
mailto:luciano@ramgarlic.commailto:luciano@ramgarlic.com -
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
top related