Share
Embed
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
Transcript
103 slides
-
• 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? -
• 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 -
• Objetos possuem atributos • Atributos podem ser: ◦ Métodos
(funções vinculadas) ◦ Atributos de dados (campos) Objetos Em Python -
• 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 -
• TUDO é um objeto ◦ Não existem tipos "primitivos"
(como em Java) Objetos Em Python -
• 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 -
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 -
• 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 -
• 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 -
• 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 -
• 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 -
• 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 -
• 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 -
• 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 -
• 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 -
• 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 -
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. -
Classes Exemplo: classe cão __init__ é o construtor self é
o 1o parametro formal em todos os métodos de instância -
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 -
• 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 -
... 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 -
... 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 -
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 -
• 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 -
• Base Herança Class-Based Views Obter e renderizar o template
Tratar o request e gerar o response -
• Base Herança Class-Based Views View que exibe um template
View que redireciona para outra url -
• Views de detalhe Herança Class-Based Views Identifica e recupera
o objeto Tratar request e response Obter e renderizar o template -
• Listagem Herança Class-Based Views Identifica e recupera a lista
de objetos Tratar request e response Obter e renderizar o template -
• 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 -
• 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 -
• 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 -
• "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 -
• 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 -
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) -
• Campos: x, y • Métodos: ◦ distancia ⇔ distância
até (0, 0) ◦ + (__add__) ◦ - (__sub__) ◦ * (__mul__) escalar ◦ == (__eq__) Sobrecarga de Operadores Exemplo: Vetor 2d -
• 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 -
• Sobrecarga de Operadores Exemplo: Vetor 2d Resultado não faz
sentido Mais um problema -
• Sobrecarga de Operadores Exemplo: Vetor 2d Verfica se é
escalar Se não delega para o interpretador Solução -
• Sobrecarga de Operadores Exemplo: Vetor 2d Comparação entre tipos
diferentes deveria retornar False. Não levantar uma exceção AttributeError Mais um problema -
• 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 -
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 -
• Sobrecarga de Operadores Atribuição aumentada Sem __imul__ *= cria
um novo objeto uma vez que Vetor não possui __imul__ -
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') -
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 -
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 -
• Exemplo Os métodos dos getter e setter precisam ter
o mesmo nome Encapsulamento Propriedades -
• 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 -
"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 -
• Fatiamento (slice) e len funcionam para sequências ◦ Listas
e string são sequências Polimorfismo Exemplos -
• Exemplo de uso do baralho Polimorfismo Baralho Polimórfico Acesso
por índice Fatiamento (slicing) -
• 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 -
… 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 -
… 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." -
… 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 -
… 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 -
… Abstract Base Class • Baralho herdando de collections.abc.Sequence Mais
três funções só por conta da herança! -
• Estes slides foram baseados no material do Luciano Ramalho
que podem ser vistos aqui: ◦ https://speakerdeck.com/ramalho Créditos