Baixe o app para aproveitar ainda mais
Prévia do material em texto
Composição de Programas em Python Programação Orientada à Objetos – Aula 02 (A) Prof. Douglas G. Macharet doug@dcc.ufmg.br Introdução Composição de Programas em Python – POO – Aula 02 (A) 2 • Como criar uma relação entre diferentes tipos (classes)? • Composição vs. Herança • Composição • Novo tipo pela junção de outras classes de menor complexidade • Utilizar apenas parte do comportamento exposto • Princípio da Herança • Reutilizar características de uma classe na definição de outra classe • Determinação de uma hierarquia de classes Composição • Conceito lógico de agrupamento • Modo particular de implementação • Não existe palavra-chave ou recurso • Princípio do encapsulamento • Acesso apenas à parte pública das classes • Menor interdependência entre classes Composição de Programas em Python – POO – Aula 02 (A) 3 Composição Composição de Programas em Python – POO – Aula 02 (A) 4 class Autor: def __init__(self, nome, cpf): self.nome = nome self.cpf = cpf class Livro: def __init__(self, titulo, ano, autor): self.titulo = titulo self.ano = ano self.autor = autor def __str__(self): return "Título: " + self.titulo + " Autor: " + self.autor.nome Composição Composição de Programas em Python – POO – Aula 02 (A) 5 https://docs.python.org/3/reference/datamodel.html#object.__repr__ class Autor: def __init__(self, nome, cpf): self.nome = nome self.cpf = cpf self.colaboradores = [] def adicionar_colaborador(self, colaborador): self.colaboradores.append(colaborador) def __repr__(self): return "Nome: %s CPF: %s" % (self.nome, self.cpf) https://docs.python.org/3/reference/datamodel.html#object.__repr__ Herança • Superclasses • Devem guardar membros em comum • Subclasses • Acrescentam novos membros (especializam) • Reutilização de código • Compartilhar similaridades • Preservar as diferenças Composição de Programas em Python – POO – Aula 02 (A) 6 Herança • Membros são herdados pelas classes dos níveis mais baixos • Considerando o nível de acesso • Subclasses podem herdar membros de: • Uma única superclasse (Java) • Herança simples • Várias superclasses (C++, Python) • Herança múltipla • O relacionamento é informado na declaração da classe Composição de Programas em Python – POO – Aula 02 (A) 7 class ClasseDerivada(ClasseBase1, ClasseBase2, …) Herança Simples Composição de Programas em Python – POO – Aula 02 (A) 8 class Personagem: def mover(self): print("Movendo...") def interagir(self): print("Interagindo...") class Medico(Personagem): def curar(self): print("Curando...") class Guerreiro(Personagem): def atacar(self): print("Atacando...") Object • Se uma classe não herda diretamente de outra classe, ela então herda de object1,2 • Essa herança é feita de forma implícita • Superclasse de nível mais alto da linguagem • Object • Possui métodos e atributos padrão Composição de Programas em Python – POO – Aula 02 (A) 9 class Robot(object): def say_hi(self): print("Hi!") Podem ser especializados nas subclasses, como vimos na aula passada com o __str__. 1Semelhante à Java, diferente de C++. 2Exceções devem herdar de BaseException ou uma classe derivada. >>> o = object() >>> dir(o) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] Object Composição de Programas em Python – POO – Aula 02 (A) 10 object bool int list Robot Pessoa Circ Aluno Professor AGrad APos Herança Simples Composição de Programas em Python – POO – Aula 02 (A) 11 Atenção: Herança Multinível é diferente de Herança Múltipla! class Pessoa(): pass class Aluno(Pessoa): pass class AGrad(Aluno): pass Princípio da Substituição de Liskov (LSP) Composição de Programas em Python – POO – Aula 02 (A) 12 • Contrato de uma classe • Encapsulamento → Interface • Coleção de atributos e métodos visíveis • Membros privados não fazem parte do contrato • Subcontratação • Subclasse estende o contrato da superclasse • Contrato redefinido não pode violar o contrato da superclasse Se S é um subtipo de T, objetos do tipo T podem ser substituídos por objetos do tipo S sem alterar nenhuma das propriedades desejadas do programa. Duck Typing Composição de Programas em Python – POO – Aula 02 (A) 13 • Linguagens OO • Geralmente verificam o contrato a partir da herança (estaticamente tipadas) • Interface única → Múltiplos comportamentos (polimorfismo) • Python • Não é necessário herdar uma classe para definir um comportamento padrão • Qualquer objeto que atenda à um determinado contrato poderá ser usado "If it walks like a duck and it quacks like a duck, then it must be a duck!" Duck Typing Composição de Programas em Python – POO – Aula 02 (A) 14 class Poligono: def __init__(self, lados): self.lados = lados class Triangulo(Poligono): def __init__(self, base, altura): self.lados = 3 self.base = base self.altura = altura def area(self): return (self.base*self.altura)/2 class Quadrado(Poligono): def __init__(self, lado): self.lados = 4 self.lado = lado def area(self): return self.lado*self.lado def maior_area(poligonos): area = 0 for poligono in poligonos: print(poligono.area()) if poligono.area() > area: area = poligono.area() return area Duck Typing Composição de Programas em Python – POO – Aula 02 (A) 15 • Reúso de código • Comportamentos gerais implementados uma única vez • Manutenção → Alterações em poucas partes do código • Contrato explícito • Maior legibilidade do código existente • Todo o contrato deve ser cumprido, não apenas partes Por que eu deveria utilizar herança então? Considerações Finais Composição de Programas em Python – POO – Aula 02 (A) 16 • Composição • Relação do tipo “tem um” (has-a) • Objeto possui objetos (≥ 1) de outras classes • Livro tem um Autor • Herança • Relação do tipo “é um” (is-a) • Subclasse tratado como a Superclasse (LSP) • Triângulo é um Polígono
Compartilhar