16
Objetos Pythonicos Orientação a objetos e padrões de projeto em Python Luciano Ramalho [email protected] setembro/2012

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

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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