Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python 3 Orientado a Objetos

Python 3 Orientado a Objetos

Workshop ministrado na Python Brasil 2016 e na Semcomp 19 Beta (na USP São Carlos) também em 2016.

Esta apresentação aborda boas práticas de orientação a objetos aplicados à linguagem Python, utilizando exemplos práticos do framework web Django.

Luiz Menezes

April 17, 2016
Tweet

More Decks by Luiz Menezes

Other Decks in Programming

Transcript

  1. • Python 2 não receberá mais atualizações ◦ Features novas

    só para o Python 3 ◦ Exceto por correções de segurança • Pouca diferença de uso entre Python 2 e Python 3 • Python 3 tem melhorias muito boas, como: ◦ Unicode strings por padrão ◦ Divisão com inteiros pode retornar float ◦ input() funciona corretamente Por quê Python 3?
  2. • Objetos são componentes de software que incluem dados e

    comportamentos ◦ Cães possuem estado (nome, cor, raça) e comportamento (latir, mexer o rabo) ◦ Bicicletas possuem estado (modelo, marcha atual, velocidade atual) e comportamento (mudar marcha, frear) • Geralmente os campos são manipulados pelos métodos do próprio objeto (encapsulamento) Objetos Conceito
  3. • Objetos possuem atributos • Atributos podem ser: ◦ Métodos

    (funções vinculadas) ◦ Atributos de dados (campos) Objetos Em Python
  4. • A função embutida dir revela os atributos e métodos

    de objetos ◦ No exemplo dir mostra os métodos do dict notas Objetos Exemplo: objeto dict
  5. • O tipo do objeto nunca muda • Dificilmente há

    conversões de tipos implícitas em Python Nota: Na última linha não há conversão implícita de tipos. A string '7' (a) é repetida 5 (b) vezes Tipos Tipagem forte
  6. Tipos Duck Typing • Duck typing é uma técnica de

    programação que evita verificar tipos. Apenas os métodos são verificados. • Essa técnica só é possível em linguagens dinâmicas Foto por cssk
  7. • Não cheque se é um pato: cheque se voa

    como um pato, anda como um pato ou fala com um pato. • Verifique exatamente qual comportamento do pato você precisa usar. Slide adaptado de email enviado por Alex Martelli em 2000 Tipos Duck Typing
  8. • Em python existem objetos mutáveis e imutáveis • Objetos

    mutáveis possuem conteúdo ou estado (atributos) que podem ser alterados • Objetos imutáveis não podem ser alterados. Tipos Mutabilidade
  9. • Imutáveis ◦ tuple ◦ int, float, complex ◦ frozenset

    ◦ str, bytes Tipos Mutabilidade • Mutáveis ◦ list ◦ dict ◦ set ◦ objetos que permitem a alteração de atributos por acesso direto, setters ou métodos
  10. • Exemplos de imutabilidade Tipos Mutabilidade O valor de "a"

    é modificado É criado um novo objeto int com valor 13. O objeto int com valor 10 não é alterado Não é possível alterar o valor de um objeto string
  11. • Variáveis são apenas referências para objetos ◦ Variáveis não

    são "caixas" como em C ou Pascal • Objeto identificado já existe quando é criada a referência Variáveis Objetos e variáveis
  12. • Objetos existem antes das variáveis • Em uma atribuição

    o lado direito do = é executado primeiro: ◦ Primeiro o objeto é criado depois atribuído, por isso a variável y nunca é criada Variáveis Objetos e variáveis
  13. • Atribuição nunca faz cópia de objetos ◦ Apenas associa

    rótulos ◦ Ou muda rótulos de lugar Nota: a[:] faz uma cópia da lista a assim. Também poderia ter sido usado a.copy() Variáveis Atribuição
  14. • Exemplo ◦ a e b referenciam o mesmo objeto

    ◦ c é uma cópia de a ◦ a, b e c começam com o mesmo conteúdo Variáveis Referências
  15. • id(obj) mostra a identidade do objeto • Duas variáveis

    podem apontar para o mesmo objeto ◦ Nesse caso, seus valores são idênticos ▪ a is b -> True • Duas variáveis podem apontar para objetos diferentes com conteúdos iguais ▪ a == b -> True Variáveis Identidade vs igualdade
  16. Classes Conceito • A classe representa a estrutura de um

    objeto ◦ Uma abstração de algo real • Exemplo: ◦ A receita (classe) de um bolo (instância da classe) contendo instruções de como prepará-lo.
  17. Classes Exemplo: classe cão __init__ é o construtor self é

    o 1o parametro formal em todos os métodos de instância
  18. Classes Exemplo: classe cão atributos da classe (qtd_patas, carnioro, nervoso)

    funcionam como valores padrão para as instâncias atributos da instância (nome) só podem ser acessados via self
  19. • Métodos da Instância ◦ Recebe a instância como argumento

    automática • Métodos de Classe ◦ Recebe a classe como argumento automático • Métodos Estáticos ◦ Funcionam como funções simples ◦ Não recebem argumentos automáticos Classes Instance method vs classmethod vs staticmethod
  20. ... Decorators • São funções que recebem a função decorada

    como argumento e produzem uma nova função que substitui a função decorada
  21. ... Decorators • Exemplos de decorators: ◦ @property, @preço.setter, @preço.deleter

    ▪ Definem métodos getter, setter e deleter ◦ @classmethod, @staticmethod ▪ Definem métodos que não precisam da instância para funcionar ◦ @abstractmethod, @abstractproperty ▪ Uso em classes abstratas
  22. New style classes • Criada em 2001 • Introdução ao

    super() • Python 2: classes precisam herdar de object Ex: class Mamifero(object) • Python 3: não existem old-style classes Old style classes Herança Subclasses de cão
  23. • Class-Based Views (CBV): ◦ Construção de views usando classes

    ◦ Criadas no Django 1.3 (2011) • Usa da herança múltipla permite criação de componentes reutilizáveis ◦ Reduz repetição de código • Django 1.9.5 (abril 2016) API navegável: http://ccbv.co.uk/ Doc. CBV Django 1.9: https://docs.djangoproject.com/en/1.9/topics/class-based-views/intro/ Herança Herança Múltipla: Class-Based Views
  24. • Views de detalhe Herança Class-Based Views Identifica e recupera

    o objeto Tratar request e response Obter e renderizar o template
  25. • Listagem Herança Class-Based Views Identifica e recupera a lista

    de objetos Tratar request e response Obter e renderizar o template
  26. • Views de remoção Herança Class-Based Views Identifica e recupera

    o objeto Tratar request e response Obter e renderizar o template Deletar o objeto
  27. • Exemplo de uso de CBV: ◦ ecom: ecommerce didático

    usado para ensinar django: https: //github.com/lamenezes/workshop-django/ ◦ No arquivo ecom/carrinho/views.py há: ▪ Usos simples de DetailView • Um deles sobrescreve o método get_object() do SingleObjectMixin ▪ 1 uso simples de ListView ▪ 1 RedirectView Herança Class-Based Views
  28. • MRO: Method Resolution Order ◦ Ordem de resolução dos

    métodos ◦ Algoritmo para definir a ordem na qual os métodos são buscados nas superclasses quando há presença de herança múltipla Mais sobre MRO: https://www.python.org/download/releases/2.3/mro/ http://python-history.blogspot.com.br/2010/06/method-resolution-order.html Herança Herança Múltipla
  29. • "Mixin é uma classe que provê funcionalidade para ser

    herdada, mas não instanciada sozinha. [...] pode ser usada para melhorar funcionalidades e comportamentos de classes" • Regra de uso de Mixins: a. A classe base deve estar sempre a direita b. Os mixins devem estar a esquerda da classe base c. As classes e mixins devem herdar de object (isso já é feito por padrão no Python 3) Nota: este slide foi adaptado do livro Two Scoops of Django 1.8 (pág. 121) Herança Herança Múltipla: Mixins
  30. • Em Python as classes podem definir seu próprio comportamento

    para os operadores da linguagem • Não é possível ◦ Redefinir a função dos operadores dos tipos embutidos ◦ Inventar novos operadores como <=>, <>, ||, && etc. Sobrecarga de Operadores Sobrecarga de Operadores
  31. Sobrecarga de Operadores Operadores • Aritméticos: + - * /

    ** // % @ • Bitwise: & ^ | << >> • Comparação: == > < >= <= • Acesso a atributos: a.b • Invocação: f(x) • Operações em coleções: c[a], len(c), a in c, iter(c) Mais em https://docs.python.org/3/reference/datamodel.html Multiplicação de matrizes (PEP465 - Python 3.5)
  32. • Campos: x, y • Métodos: ◦ distancia ⇔ distância

    até (0, 0) ◦ + (__add__) ◦ - (__sub__) ◦ * (__mul__) escalar ◦ == (__eq__) Sobrecarga de Operadores Exemplo: Vetor 2d
  33. • Como funciona x * y • Se x.__mul__ não

    existe ou retorna o valor especial NotImplemented ou: ◦ O interpretador do Python invoca y.__rmul__(x) ◦ Se y.__rmul__(x) não existe ou o valor NotImplemented é retornado ou a exceção TypeError é levantada • Para o nosso exemplo como não existe int * Vetor precisamos implementar Vetor.__rmul__ para realizar essa operação Sobrecarga de Operadores Operadores reversos
  34. • Sobrecarga de Operadores Exemplo: Vetor 2d Verfica se é

    escalar Se não delega para o interpretador Solução
  35. • Sobrecarga de Operadores Exemplo: Vetor 2d Comparação entre tipos

    diferentes deveria retornar False. Não levantar uma exceção AttributeError Mais um problema
  36. • Solução Se for comparado com Vetor retorna resulado da

    comparação Sobrecarga de Operadores Exemplo: Vetor 2d Se não for Vetor retorna False
  37. Sobrecarga de Operadores Atribuição aumentada • Operadores: += -= *=

    /= //= **= %= &= ^= |= <<= >>= • Para tipos imutáveis a += b ⇔ a = a + b, ou seja: ◦ Um novo objeto (a + b) é criado. • Para tipos imutáveis, a implementação de atribuição aumentada (como __iadd__) permite a modificação do objeto alvo da operação
  38. • Sobrecarga de Operadores Atribuição aumentada Sem __imul__ *= cria

    um novo objeto uma vez que Vetor não possui __imul__
  39. Sobrecarga de Operadores Controle de atributos • Métodos para controle:

    ◦ Quando obj não possui atributo a é acionado: ▪ obj.a ⇔ obj.__getattr__('a') ◦ Acionados sempre: ▪ obj.a = x ⇔ obj.__setattr__('a', x) ▪ del obj.a ⇔ obj.__delattr__('a')
  40. Encapsulamento Encapsulamento • Encapsulamento é o mecanismo de restrição de

    acesso aos componentes de um objeto ◦ ou seja, a representação interna do objeto não pode ser vista de fora da definição desse objeto • Geralmente o acesso a esses dados são feitos através de getters e setters
  41. Encapsulamento Propriedades • Em Python o encapsulamento é feito através

    de propriedades ◦ As propriedades tornam o encapsulamento imperceptível para o usuário (você) • Encapsulamento para quem precisa de encapsulamento
  42. • Exemplo Os métodos dos getter e setter precisam ter

    o mesmo nome Encapsulamento Propriedades
  43. • Não existe restrição de acesso ◦ O python somente

    ofusca essas variáveis • Começam com __ ◦ Exemplos: __lista, __x, __elem, __etc • Servem para evitar atribuição ou escrita acidental ... Atributos e métodos protegidos
  44. "O conceito de “polimorfismo” significa que podemos tratar instâncias de

    diferentes classes da mesma maneira. Assim, podemos enviar uma mensagem a um objeto sem saber de antemão, qual é o seu tipo, e o objeto ainda assim fará "a coisa certa", pelo menos de seu ponto de vista." Scott Ambler - The Object Primer, 2nd ed. - p. 173 Polimorfismo Definição
  45. • Fatiamento (slice) e len funcionam para sequências ◦ Listas

    e string são sequências Polimorfismo Exemplos
  46. • Protocolo é uma interface definida por convenção e não

    formalmente verificada pelo compilador • Em Python o protocolo de sequência (imutável) possui apenas dois métodos: ◦ __getitem__ e __len__ • No exemplo anterior foi implementado o método __setitem__ para ser possível usar a função random. shuffle() … Protocolo
  47. … Protocolo • Mas onde estão os protocolos? • Documentação

    oficial: ◦ Language Reference > Data Model (https://docs.python.org/3/reference/datamodel.html) ▪ Seção 3.2 - The standard type hierarchy ▪ Seção 3.3 - Special method names
  48. … Protocolo • 3.3 - Special method names "When implementing

    a class that emulates any built-in type, it is important that the emulation only be implemented to the degree that it makes sense for the object being modelled. For example, some sequences may work well with retrieval of individual elements, but extracting a slice may not make sense."
  49. … Interfaces vs protocolos vs ABC • Interfaces: verificadas pelo

    compilador ◦ Não existe em Python • Protocolos: definidos pela documentação, não declarados e muito menos verificados ◦ Duck typing! • ABC: Abstract Base Classes ◦ Classes abstratas
  50. … Abstract Base Class • Classes abstratas • Python 2.6

    / Python 3 (2008) • Uma forma de especificar interfaces para outras classes implementar • Verificação de implementação feita na instanciação e não pelo interpretador do Python Saiba mais em: https://docs.python.org/3/library/abc.html
  51. • Estes slides foram baseados no material do Luciano Ramalho

    que podem ser vistos aqui: ◦ https://speakerdeck.com/ramalho Créditos