setembro/2012 objetos pythonicosturing.com.br/material/oopy/oopy-t1a6.pdf · argumento e produzem...
TRANSCRIPT
Objetos PythonicosOrientação a objetos e padrões de projeto em Python
Luciano [email protected]
setembro/2012
Aula 6
• Exemplo de herança múltipla: Django Generic CBV
• Class-based views
• Objetos invocáveis
• Classes Abstratas
• Injeção de dependência
• ...
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)
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
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
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
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
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)
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')
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
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
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
CBV: divisão de tarefas
obter e renderizar o template
tratar o request e produzir o response
CBV: views de detalhe
obter e renderizar o template
tratarrequest/response
identificar e recuperar o objeto
CBV: views de listagem
obter e renderizar o template
tratarrequest/response
identificar e recuperar a
lista de objetos
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