Slide 1

Slide 1 text

Python 3 Orientado a Objetos

Slide 2

Slide 2 text

● 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?

Slide 3

Slide 3 text

1. Objetos

Slide 4

Slide 4 text

● 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

Slide 5

Slide 5 text

● Objetos possuem atributos ● Atributos podem ser: ○ Métodos (funções vinculadas) ○ Atributos de dados (campos) Objetos Em Python

Slide 6

Slide 6 text

Objetos Exemplo: objeto dict

Slide 7

Slide 7 text

● 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

Slide 8

Slide 8 text

● Sobrecarga de operadores: ○ []: __getitem__, __setitem__ Objetos Exemplo: objeto dict

Slide 9

Slide 9 text

● Dados: __class__, __doc__ Objetos Exemplo: objeto dict

Slide 10

Slide 10 text

● TUDO é um objeto ○ Não existem tipos "primitivos" (como em Java) Objetos Em Python

Slide 11

Slide 11 text

● Funções são objetos Objetos Em Python

Slide 12

Slide 12 text

● Funções são objetos Objetos Em Python

Slide 13

Slide 13 text

2. Tipos

Slide 14

Slide 14 text

● 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

Slide 15

Slide 15 text

● Variáveis não possuem tipos Tipos Tipagem dinâmica

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

● 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

Slide 18

Slide 18 text

● 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

Slide 19

Slide 19 text

● 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

Slide 20

Slide 20 text

● 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

Slide 21

Slide 21 text

3. Variáveis

Slide 22

Slide 22 text

● 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

Slide 23

Slide 23 text

● 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

Slide 24

Slide 24 text

● 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

Slide 25

Slide 25 text

● 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

Slide 26

Slide 26 text

● 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

Slide 27

Slide 27 text

4. Classes

Slide 28

Slide 28 text

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.

Slide 29

Slide 29 text

Classes Exemplo: classe cão

Slide 30

Slide 30 text

Classes Exemplo: classe cão __init__ é o construtor self é o 1o parametro formal em todos os métodos de instância

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Classes Exemplo: classe cão ● Atributo de classe vs instância

Slide 33

Slide 33 text

● 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

Slide 34

Slide 34 text

Classes Instance method vs classmethod vs staticmethod

Slide 35

Slide 35 text

... 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

Slide 36

Slide 36 text

... 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

Slide 37

Slide 37 text

5. Herança

Slide 38

Slide 38 text

Herança Subclasses de cão

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Herança Subclasses de cão: o Pinscher

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

● 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

Slide 44

Slide 44 text

● Base Herança Class-Based Views Obter e renderizar o template Tratar o request e gerar o response

Slide 45

Slide 45 text

● Base Herança Class-Based Views View que exibe um template View que redireciona para outra url

Slide 46

Slide 46 text

● Views de detalhe Herança Class-Based Views Identifica e recupera o objeto Tratar request e response Obter e renderizar o template

Slide 47

Slide 47 text

● Listagem Herança Class-Based Views Identifica e recupera a lista de objetos Tratar request e response Obter e renderizar o template

Slide 48

Slide 48 text

● 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

Slide 49

Slide 49 text

● 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

Slide 50

Slide 50 text

● 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

Slide 51

Slide 51 text

● MRO: Exemplo Herança Herança Múltipla

Slide 52

Slide 52 text

● MRO: Exemplo Herança Herança Múltipla

Slide 53

Slide 53 text

● "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

Slide 54

Slide 54 text

6. Sobrecarga de operadores

Slide 55

Slide 55 text

● 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

Slide 56

Slide 56 text

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)

Slide 57

Slide 57 text

● Campos: x, y ● Métodos: ○ distancia ⇔ distância até (0, 0) ○ + (__add__) ○ - (__sub__) ○ * (__mul__) escalar ○ == (__eq__) Sobrecarga de Operadores Exemplo: Vetor 2d

Slide 58

Slide 58 text

● Sobrecarga de Operadores Exemplo: Vetor 2d

Slide 59

Slide 59 text

● Sobrecarga de Operadores Exemplo: Vetor 2d

Slide 60

Slide 60 text

● Sobrecarga de Operadores Exemplo: Vetor 2d Um problema nesse código

Slide 61

Slide 61 text

● 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

Slide 62

Slide 62 text

● Sobrecarga de Operadores Operadores reversos operador reverso Solução

Slide 63

Slide 63 text

● Sobrecarga de Operadores Exemplo: Vetor 2d Resultado não faz sentido Mais um problema

Slide 64

Slide 64 text

● Sobrecarga de Operadores Exemplo: Vetor 2d Verfica se é escalar Se não delega para o interpretador Solução

Slide 65

Slide 65 text

● Sobrecarga de Operadores Exemplo: Vetor 2d Comparação entre tipos diferentes deveria retornar False. Não levantar uma exceção AttributeError Mais um problema

Slide 66

Slide 66 text

● 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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

● Sobrecarga de Operadores Atribuição aumentada Sem __imul__ *= cria um novo objeto uma vez que Vetor não possui __imul__

Slide 69

Slide 69 text

Mesmo vetor Sobrecarga de Operadores Atribuição aumentada Com __imul__ Modifica e devolve sef

Slide 70

Slide 70 text

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')

Slide 71

Slide 71 text

Sobrecarga de Operadores Controle de atributos: Proxy ● Exemplo

Slide 72

Slide 72 text

Sobrecarga de Operadores Proxy

Slide 73

Slide 73 text

7. Encapsulamento

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

Encapsulamento Propriedades ● Exemplo Apenas leitura, via decorator @property

Slide 77

Slide 77 text

Encapsulamento Propriedades ● Exemplo Leitura (getter) Escrita (setter)

Slide 78

Slide 78 text

● Exemplo Os métodos dos getter e setter precisam ter o mesmo nome Encapsulamento Propriedades

Slide 79

Slide 79 text

Encapsulamento Propriedades ● Exemplo

Slide 80

Slide 80 text

● 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

Slide 81

Slide 81 text

● Exemplo: ... Atributos e métodos protegidos

Slide 82

Slide 82 text

8. Polimorfismo

Slide 83

Slide 83 text

"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

Slide 84

Slide 84 text

● Fatiamento (slice) e len funcionam para sequências ○ Listas e string são sequências Polimorfismo Exemplos

Slide 85

Slide 85 text

Polimorfismo Exemplos

Slide 86

Slide 86 text

● Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Acesso por índice Fatiamento (slicing)

Slide 87

Slide 87 text

● Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Iteração!

Slide 88

Slide 88 text

● Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Iteração!!1!11! reversa

Slide 89

Slide 89 text

● Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Sorteio!11!!

Slide 90

Slide 90 text

● Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Enumeração!! 1!11!

Slide 91

Slide 91 text

● Quanto custa tudo isso? ● 11 linhas!!!11!1!!! Polimorfismo Baralho Polimórfico

Slide 92

Slide 92 text

● 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

Slide 93

Slide 93 text

… 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

Slide 94

Slide 94 text

… 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."

Slide 95

Slide 95 text

… 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

Slide 96

Slide 96 text

… 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

Slide 97

Slide 97 text

… Abstract Base Class ● collections.abc

Slide 98

Slide 98 text

… Abstract Base Class ● Baralho herdando de collections.abc.Sequence

Slide 99

Slide 99 text

… Abstract Base Class ● Baralho herdando de collections.abc.Sequence Mais três funções só por conta da herança!

Slide 100

Slide 100 text

● Baralho mutável … Baralho Polimórfico EMBARALHAMENTO!!1!! 1!!!!!1!

Slide 101

Slide 101 text

… Baralho Polimórfico ● Baralho mutável

Slide 102

Slide 102 text

● Estes slides foram baseados no material do Luciano Ramalho que podem ser vistos aqui: ○ https://speakerdeck.com/ramalho Créditos

Slide 103

Slide 103 text

PyLadies São Carlos saocarlos.pyladies.com facebook.com/PyLadiesSaoCarlos twitter.com/PyLadiesSanca Obrigado!