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?
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
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
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
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
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
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
▪ 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
◦ 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
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
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
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
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
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
/= //= **= %= &= ^= |= <<= >>= • 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
◦ 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')
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
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
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
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
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."
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
/ 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