![Page 1: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/1.jpg)
Objetos PythonicosOrientação a objetos e padrões de projeto em Python
Luciano [email protected]
setembro/2012
![Page 2: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/2.jpg)
Aula 6
• Exemplo de herança múltipla: Django Generic CBV
• Class-based views
• Objetos invocáveis
• Classes Abstratas
• Injeção de dependência
• ...
![Page 3: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/3.jpg)
Objetos invocáveis
• Toda função é um objeto em Python
• Você pode definir suas próprias funções (óbvio)
• Mas também pode definir novas classes de objetos que se usam como funções: objetos invocáveis
• basta definir um método __call__ para sobrecarregar o operador de invocação: o(x)
![Page 4: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/4.jpg)
Tômbola invocável
• Já que o principal uso de uma instância de tômbola é sortear, podemos criar um atalho:em vez de t.sortear()apenas t()
from tombola import Tombola
class TombolaInvocavel(Tombola): '''Sorteia itens sem repetir; a instância é invocável como uma função'''
def __call__(self): return self.sortear()
>>> t = TombolaInvocavel()>>> t.carregar([1, 2, 3])>>> t()3>>> t()2
![Page 5: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/5.jpg)
Injeção de dependência• Componente cliente requisita serviço de um
componente provedor
• O componente provedor depende de um terceiro componente para realizar seu serviço (essa é a dependência)
• Na injeção de dependência, o cliente fornece ao provedor a tal dependência
• Exemplo simples: classe de data “congelada”para facilitar testes automatizados
![Page 6: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/6.jpg)
Data congelada
• Para injeção em testes que dependem de date.today(), a classe FrozenDate devolve sempre a mesma data para “hoje”*
from datetime import date
class FrozenDate(date):
@staticmethod def today(): return date.fromtimestamp(10**9) # 2001-09-08
>>> d = FrozenDate.today()>>> ddatetime.date(2001, 9, 8)
* 8/set/2001 foi o dia do segundo 1.000.000 da época Unix
![Page 7: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/7.jpg)
Decoradores de funções
• Informalmente, já vimos alguns:
• @property, @x.setter, @staticmethod
• Não têm relação com o padrão de projeto “decorator”
• São funções que recebem a função decorada como argumento e produzem uma nova função que substitui a função decorada
• Esse mecanismo é tema de outro curso
![Page 8: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/8.jpg)
Decoradores de métodos• Usados na definição de métodos em classes
• @property, @x.setter, @x.deleter: definem métodos getter, setter e deleter para propriedades
• @classmethod, @staticmethod: definem métodos que não precisam de uma instância para operar
• @abstractmethod, @abstractproperty: uso em classes abstratas (veremos logo mais)
![Page 9: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/9.jpg)
classmethod x staticmethod• Métodos estáticos são como funções simples
embutidas em uma classe: não recebem argumentos automáticos
• Métodos de classe recebem a classe como argumento automático
class Exemplo(object): @staticmethod def estatico(arg): return arg @classmethod def da_classe(cls, arg): return (cls, arg)
>>> Exemplo.estatico('bar')'bar' >>> Exemplo.da_classe('fu')(<class '__main__.Exemplo'>, 'fu')
![Page 10: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/10.jpg)
Exemplo de classmethod
class Carta(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, valor, naipe): self.valor = valor self.naipe = naipe def __repr__(self): return 'Carta(%r, %r)' % (self.valor, self.naipe)
@classmethod def todas(cls): return [cls(v, n) for n in cls.naipes for v in cls.valores]
• É conveniente em todas ter acesso à classe para acessar os atributos (naipes, valores) e para instanciar as cartas
![Page 11: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/11.jpg)
Decoradores de classes
• Novidade do Python 2.6, ainda pouco utilizada na prática
• Exemplo na biblioteca padrão a partir do Python 2.7:
• functools.total_ordering define automaticamente métodos para os operadores de comparação < > <= >=
http://docs.python.org/library/functools.html#functools.total_ordering
![Page 12: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/12.jpg)
Exemplo de herança múltipla no Django• Class-based views (CBV): classes para a construção
de views, desde o Django 1.3
• Divisão de tarefas para a construção modular de views, diminuindo código repetitivo
• Vamos explorar views básicas e list/detail
API navegável: http://ccbv.co.uk/
Apostila (em desenvolvimento) com diagramas UML: http://turing.com.br/material/acpython/mod3/django/views1.html
![Page 13: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/13.jpg)
CBV: divisão de tarefas
obter e renderizar o template
tratar o request e produzir o response
![Page 14: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/14.jpg)
CBV: views de detalhe
obter e renderizar o template
tratarrequest/response
identificar e recuperar o objeto
![Page 15: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/15.jpg)
CBV: views de listagem
obter e renderizar o template
tratarrequest/response
identificar e recuperar a
lista de objetos
![Page 16: setembro/2012 Objetos Pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem uma nova função que substitui a função decorada • Esse mecanismo é tema de](https://reader035.vdocuments.mx/reader035/viewer/2022071219/605431ba017c0b0e711f3656/html5/thumbnails/16.jpg)
Exemplo de uso de CBV• django-ibge: API restful fornecendo JSON para
JQuery mostrar regiões, estados e municípios
• No arquivo municipios/views.py:
• uma subclasse bem simples de ListView
• No arquivo municipios/api.py
• 4 subclasses de BaseListView com JSONResponseMixin
https://github.com/oturing/django-ibge