Python 3 Orientado a Objetos

Python 3 Orientado a Objetos

Minicurso apresentado na Semcomp 19 Beta na USP São Carlos em 17/04/2016 pelo PyLadies São Carlos

Esta apresentação aborda os conceitos de orientação a objetos aplicados ao Python usando exemplos práticos do framework web Django.

Fd349405eaec4414ccf8720edea9b4fa?s=128

Luiz Menezes

April 17, 2016
Tweet

Transcript

  1. Python 3 Orientado a Objetos

  2. • 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?
  3. 1. Objetos

  4. • 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
  5. • Objetos possuem atributos • Atributos podem ser: ◦ Métodos

    (funções vinculadas) ◦ Atributos de dados (campos) Objetos Em Python
  6. Objetos Exemplo: objeto dict

  7. • 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
  8. • Sobrecarga de operadores: ◦ []: __getitem__, __setitem__ Objetos Exemplo:

    objeto dict
  9. • Dados: __class__, __doc__ Objetos Exemplo: objeto dict

  10. • TUDO é um objeto ◦ Não existem tipos "primitivos"

    (como em Java) Objetos Em Python
  11. • Funções são objetos Objetos Em Python

  12. • Funções são objetos Objetos Em Python

  13. 2. Tipos

  14. • 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
  15. • Variáveis não possuem tipos Tipos Tipagem dinâmica

  16. 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
  17. • 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
  18. • 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
  19. • 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
  20. • 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
  21. 3. Variáveis

  22. • 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
  23. • 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
  24. • 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
  25. • 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
  26. • 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
  27. 4. Classes

  28. 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.
  29. Classes Exemplo: classe cão

  30. Classes Exemplo: classe cão __init__ é o construtor self é

    o 1o parametro formal em todos os métodos de instância
  31. 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
  32. Classes Exemplo: classe cão • Atributo de classe vs instância

  33. • 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
  34. Classes Instance method vs classmethod vs staticmethod

  35. ... 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
  36. ... 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
  37. 5. Herança

  38. Herança Subclasses de cão

  39. 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
  40. Herança Subclasses de cão: o Pinscher

  41. Herança Subclasses de cão: o Golden Retriever

  42. Herança Subclasses de cão especialização generalização

  43. • 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
  44. • Base Herança Class-Based Views Obter e renderizar o template

    Tratar o request e gerar o response
  45. • Base Herança Class-Based Views View que exibe um template

    View que redireciona para outra url
  46. • Views de detalhe Herança Class-Based Views Identifica e recupera

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

    de objetos Tratar request e response Obter e renderizar o template
  48. • 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
  49. • 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
  50. • 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
  51. • MRO: Exemplo Herança Herança Múltipla

  52. • MRO: Exemplo Herança Herança Múltipla

  53. • "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
  54. 6. Sobrecarga de operadores

  55. • 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
  56. 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)
  57. • Campos: x, y • Métodos: ◦ distancia ⇔ distância

    até (0, 0) ◦ + (__add__) ◦ - (__sub__) ◦ * (__mul__) escalar ◦ == (__eq__) Sobrecarga de Operadores Exemplo: Vetor 2d
  58. • Sobrecarga de Operadores Exemplo: Vetor 2d

  59. • Sobrecarga de Operadores Exemplo: Vetor 2d

  60. • Sobrecarga de Operadores Exemplo: Vetor 2d Um problema nesse

    código
  61. • 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
  62. • Sobrecarga de Operadores Operadores reversos operador reverso Solução

  63. • Sobrecarga de Operadores Exemplo: Vetor 2d Resultado não faz

    sentido Mais um problema
  64. • Sobrecarga de Operadores Exemplo: Vetor 2d Verfica se é

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

    diferentes deveria retornar False. Não levantar uma exceção AttributeError Mais um problema
  66. • 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
  67. 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
  68. • Sobrecarga de Operadores Atribuição aumentada Sem __imul__ *= cria

    um novo objeto uma vez que Vetor não possui __imul__
  69. Mesmo vetor Sobrecarga de Operadores Atribuição aumentada Com __imul__ Modifica

    e devolve sef
  70. 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')
  71. Sobrecarga de Operadores Controle de atributos: Proxy • Exemplo

  72. Sobrecarga de Operadores Proxy

  73. 7. Encapsulamento

  74. 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
  75. 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
  76. Encapsulamento Propriedades • Exemplo Apenas leitura, via decorator @property

  77. Encapsulamento Propriedades • Exemplo Leitura (getter) Escrita (setter)

  78. • Exemplo Os métodos dos getter e setter precisam ter

    o mesmo nome Encapsulamento Propriedades
  79. Encapsulamento Propriedades • Exemplo

  80. • 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
  81. • Exemplo: ... Atributos e métodos protegidos

  82. 8. Polimorfismo

  83. "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
  84. • Fatiamento (slice) e len funcionam para sequências ◦ Listas

    e string são sequências Polimorfismo Exemplos
  85. Polimorfismo Exemplos

  86. • Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Acesso

    por índice Fatiamento (slicing)
  87. • Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Iteração!

  88. • Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Iteração!!1!11!

    reversa
  89. • Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Sorteio!11!!

  90. • Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Enumeração!!

    1!11!
  91. • Quanto custa tudo isso? • 11 linhas!!!11!1!!! Polimorfismo Baralho

    Polimórfico
  92. • 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
  93. … 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
  94. … 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."
  95. … 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
  96. … 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
  97. … Abstract Base Class • collections.abc

  98. … Abstract Base Class • Baralho herdando de collections.abc.Sequence

  99. … Abstract Base Class • Baralho herdando de collections.abc.Sequence Mais

    três funções só por conta da herança!
  100. • Baralho mutável … Baralho Polimórfico EMBARALHAMENTO!!1!! 1!!!!!1!

  101. … Baralho Polimórfico • Baralho mutável

  102. • Estes slides foram baseados no material do Luciano Ramalho

    que podem ser vistos aqui: ◦ https://speakerdeck.com/ramalho Créditos
  103. PyLadies São Carlos saocarlos.pyladies.com facebook.com/PyLadiesSaoCarlos twitter.com/PyLadiesSanca Obrigado!