Prévia do material em texto
Paradigmas de Linguagens de Programação em Python Prof. Julio Cartier Maia Gomes Python orientado a objeto Imagine que você foi contratado para desenvolver o sistema de um banco digital. Esse sistema precisa gerenciar contas bancárias, realizar depósitos, e saques. ● Como você organizaria isso em código? 3 Revisando Um paradigma é um conjunto de regras que estabelecem fronteiras e descrevem como resolver problemas dentro desta fronteira. 4 O paradigma de Orientação a Objetos pode ser encarado como uma forma de pensar o seu projeto, desde a arquitetura até a implementação. Programação orientada a objetos (POO) A programação orientada a objetos (POO) é um dos paradigmas mais utilizados atualmente no desenvolvimento de sistemas Permitem construir programas baseados em objetos que representam o mundo real, por meio de características, estados e comportamentos. 5 Abstração Modelar elementos do mundo real de forma simplificada. 6 Classe Atributos Métodos 7 Objetos Corpo de uma Classe ● O corpo de uma classe pode conter: ● Atributos; ● Métodos; 8 Classes ● Servem como modelo ou categoria para um determinado conjunto de objetos: 9 Objetos 10 É a representação computacional de um elemento ou processo do mundo real. Classes e Objetos 11 Atributos ● Caracteriza as propriedades dos objetos da classe: 12 Atributos 13 Métodos ■ Comportamento da classe por meio de operações que ela pode executar, ou seja, compreende as funcionalidades da classe; 14 Construtor ● Construtor da Classe; ● Inicialização de um objeto da classe; ● O construtor de uma classe é um método especial com as seguintes características: ● É o primeiro método executado por um objeto ● É obrigatório uma classe conter ao menos um construtor. 15 Imagine que você foi contratado para desenvolver o sistema de um banco digital. Esse sistema precisa gerenciar contas bancárias, realizar depósitos, e saques. ● Como você organizaria isso em código? 16 Padrão de resposta esperado 17 CONTA1 agencia = “3133-1” conta = “21312-0 Atributos CONTA2 agencia = “2132-1” conta = “91212-0 Classe Métodos Instâncias C++ Java PHP Python Ruby 18 Construção de classe com auxílio da linguagem de programação Questão 1 A programação orientada a objetos (OO) é um paradigma que organiza o código a partir de alguns pilares básicos: objetos, atributos (dados) e métodos (operações), que definem seu estado e comportamento. Em programação orientada a objetos (OO), qual das seguintes afirmações é verdadeira sobre objetos, atributos e operações? a Um objeto é uma definição de classe que especifica atributos e métodos. b Atributos são funções que definem o comportamento de um objeto. c Operações, ou métodos, são os dados armazenados em um objeto. d Um objeto é uma instância de uma classe, contendo atributos e métodos. e Atributos e métodos são sinônimos em programação orientada a objetos. 19 A programação orientada a objetos (OO) é um paradigma que organiza o código a partir de alguns pilares básicos: objetos, atributos (dados) e métodos (operações), que definem seu estado e comportamento. Em programação orientada a objetos (OO), qual das seguintes afirmações é verdadeira sobre objetos, atributos e operações? a Um objeto é uma definição de classe que especifica atributos e métodos. b Atributos são funções que definem o comportamento de um objeto. c Operações, ou métodos, são os dados armazenados em um objeto. d Um objeto é uma instância de uma classe, contendo atributos e métodos. e Atributos e métodos são sinônimos em programação orientada a objetos. 20 Questão 1 Questão 2 Uma classe é um componente central na programação orientada a objetos (OO). Avalie sua compreensão desse conceito fundamental respondendo à questão a seguir. Qual das seguintes afirmações é verdadeira sobre classes na programação orientada a objetos? a Uma classe é uma instância de um objeto que contém atributos e métodos. b Classes não podem conter métodos, apenas atributos. c Uma classe define atributos e métodos, servindo como um molde para criar objetos. d A classe é usada apenas para agrupar funções sem nenhum dado associado. e Objetos e classes são exatamente a mesma coisa em programação orientada a objetos. 21 Questão 2 Uma classe é um componente central na programação orientada a objetos (OO). Avalie sua compreensão desse conceito fundamental respondendo à questão a seguir. Qual das seguintes afirmações é verdadeira sobre classes na programação orientada a objetos? a Uma classe é uma instância de um objeto que contém atributos e métodos. b Classes não podem conter métodos, apenas atributos. c Uma classe define atributos e métodos, servindo como um molde para criar objetos. d A classe é usada apenas para agrupar funções sem nenhum dado associado. e Objetos e classes são exatamente a mesma coisa em programação orientada a objetos. 22 SEM POO 23 COM POO 24 Pontos Chaves 25 Referências BEZERRA, E. Princípios de análise e projeto de sistemas com UML. 3. ed. Rio de Janeiro, Campus, 2015. BOOCH, Grady; RUMBAUGH, James; JACOBSON, Ivar. UML : guia do usuario. Tradução de Fabio Freitas. 2. ed. revista e atualizada Rio de Janeiro: Campus: Elsevier, 2006. ISBN 85-352-0562-4. FOWLER, Martin. UML essencial: um breve guia para linguagem-padrão de modelagem de objetos. 3. ed. Porto Alegre: Bookman, 2011. 1 recurso online. ISBN 9788560031382. Acesso em: 11 jun. 2025. 26 Referências HORSTMANN, C. Conceitos de computação com o essencial de C++. 3. ed. Porto Alegre: Bookman, 2005. SANTOS, Marcela Gonçalves dos. Linguagem de programação [recurso eletrônico] / Marcela Gonçalves dos Santos; revisão técnica: Jeferson Faleiro Leon. – Porto Alegre: SAGAH, 2018. 27 Conceitos e pilares de programação orientada a objetos Conceitos de programação orientada a objetos (POO) A Programação Orientada a Objetos (POO) revolucionou a estruturação de programas de computador. Ela se baseia em pensar abstratamente problemas do mundo real usando conceitos reais em vez de ideias puramente computacionais. A abordagem baseada em objetos permite que os mesmos conceitos e notações sejam usados desde a análise até a implementação de um projeto de software. O software na POO é organizado como uma coleção de objetos que incorporam tanto a estrutura quanto o comportamento dos dados. Conceitos e pilares de programação orientada a objetos Pilares da orientação a objetos Objetos Um objeto na programação orientada a objetos é a representação computacional de um elemento ou processo do mundo real. Cada objeto possui características (informações) e operações (comportamento) que podem alterar suas características (estado). Os objetos no mundo real e na programação são variados, como Aluno, Professor, Livro, Empréstimo, e assim por diante. Na análise de objetos, é importante focar apenas nos objetos relevantes e suas características essenciais para resolver o problema em questão. Conceitos e pilares de programação orientada a objetos Pilares da orientação a objetos Atributos São propriedades do mundo real que descrevem um objeto. Cada objeto possui as respectivas propriedades desse mundo, as quais, por sua vez, possuem valores. Nome - Maria Idade - 35 Peso - 63kg Altura - 1,70m Conceitos e pilares de programação orientada a objetos Pilares da orientação a objetos Operações Operações são funções que podem ser aplicadas a objetos ou seus dados. Cada objeto tem um conjunto de operações definidas em sua interface. Objetos colaboram entre si por meio de suas interfaces, permitindo que operações sejam realizadas. Desenvolver sistemas orientados a objetos envolve identificar objetos, seus atributos e operações, e mapear isso para resolver problemas. Conceitos e pilares de programação orientada a objetos O conceito de classe ▪ Uma classe descreve as características e o comportamento de um conjunto deobjetos. ▪ Objetos são instâncias de uma classe. ▪ As classes são os blocos básicos para a construção de programas orientados a objetos. ▪ Os objetos colaboram entre si, enviando mensagens e chamando operações para resolver problemas computacionais. Colaboração entre motorista e carro. O conceito de encapsulamento O encapsulamento separa os aspectos externos de um objeto de seus detalhes internos de implementação. Isso permite que a interface de comunicação de um objeto revele o mínimo possível sobre seu funcionamento interno. Os objetos clientes só precisam conhecer as operações disponíveis, sem necessidade de entender a implementação. O encapsulamento facilita a manutenção e evolução do sistema, isolando alterações internas dos objetos. Os mecanismos de herança e polimorfismo Herança A herança é um mecanismo na programação orientada a objetos onde as classes compartilham atributos e comportamentos. Permite criar hierarquias de classes, com classes "filhas" herdando características de classes "pais". Classes "filhas" podem reutilizar e especializar comportamentos da classe "pai". Facilita a evolução de sistemas, permitindo a adição de novas classes à hierarquia. Os mecanismos de herança e polimorfismo Polimorfismo Polimorfismo é a capacidade de comportamentos diferentes em classes diferentes. Permite que uma mesma mensagem seja executada de maneira diversa, dependendo do objeto receptor. Isso ocorre ao reimplementar um método nas subclasses de uma herança. Exemplo: o método "mover()" pode ter diferentes implementações em classes distintas. Os mecanismos de herança e polimorfismo Polimorfismo mover() – método polimórfico. Classes e objetos Definição de classe Uma classe é uma declaração de tipo que encapsula variáveis, constantes e métodos. Cada classe deve ser única em um sistema orientado a objetos. É boa prática manter uma classe em um arquivo .py com um nome correspondente, como "Conta.py". As classes são definidas com a palavra-chave "class" seguida de ":". Classes e objetos Construtores e self Em Python, o construtor de uma classe é definido pelo método __init__(). O construtor é usado para inicializar os atributos da classe quando um objeto é instanciado. O construtor tem um parâmetro chamado self, que é uma referência ao próprio objeto sendo criado. A palavra-chave self é usada para se referir aos atributos do objeto dentro do construtor. Classes e objetos Métodos As classes em Python possuem métodos que permitem manipular os atributos da classe. Os métodos são funções definidas dentro da classe e operam no objeto instanciado. Os métodos podem receber o parâmetro self, que é uma referência ao próprio objeto. O self é usado para acessar e modificar os atributos do objeto dentro dos métodos. Classes e objetos Métodos com retorno ▪ Métodos em Python podem retornar valores. ▪ A palavra-chave return é usada para especificar o valor de retorno. ▪ O valor de retorno fornece informações de volta ao chamador do método. ▪ No exemplo, o método sacar retorna False se o saque for maior que o saldo disponível. Classes e objetos Referências entre objetos na memória Instâncias de uma classe representam objetos distintos, com referências separadas na memória. Referências diferentes para objetos permitem operações independentes e não afetam uns aos outros. Para interações entre objetos, é possível passar referências de um objeto como parâmetros para métodos. Esse conceito de referências entre objetos é fundamental para a programação orientada a objetos, permitindo comunicação controlada. Tipos de associação entre objetos Agregação A agregação é um relacionamento "todo-parte" entre classes. Ela indica que uma classe contém ou é composta por instâncias de outra classe. Os objetos contidos podem existir independentemente da classe que os contém. É representada visualmente por um losango e modela relações complexas, como uma conta corrente com vários clientes. Tipos de associação entre objetos Composição ▪ Composição é um relacionamento "todo-parte" entre classes, onde uma classe contém uma ou mais instâncias de outra classe. ▪ Na composição, os objetos contidos só podem existir como parte do objeto que os contém. ▪ A classe Conta agora é composta por vários objetos Extrato, permitindo que ela armazene transações realizadas e gere extratos. ▪ As transações realizadas são adicionadas como linhas ao objeto Extrato, que é referenciado pela classe Conta. Classe Conta composta de 1 ou mais extratos. Integridade dos objetos: encapsulamento Encapsulamento Encapsulamento: Protege a integridade dos objetos, evitando alterações indevidas nos atributos. Reunião de dados e funções: A orientação a objetos reúne dados e métodos em uma única entidade. Exemplo de encapsulamento: Impede alterações diretas nos atributos que violam as regras de negócio. Método sacar: Não permite que o saldo fique negativo, mantendo o estado válido do sistema. Integridade dos objetos: encapsulamento Atributos públicos e privados Atributos privados: Em Python, são definidos iniciando com dois underscores (ex: __atributo). Acesso: O interpretador renomeia o atributo privado para _nomedaClasse__no medoatributo. Prática não recomendada: Embora seja possível acessar atributos privados, isso viola o encapsulamento da orientação a objetos. Boas práticas: A disciplina deve ser mantida para não acessar diretamente atributos com __ ou _ definidos nas classes. Integridade dos objetos: encapsulamento Decorator @property Decorator @property: Utilizado para criar propriedades em métodos, permitindo o acesso controlado a atributos privados. Método @.setter: Usado para controlar alterações de valores dos atributos privados, garantindo o encapsulamento. Boa prática: Definir métodos property e setter somente quando há regras de negócio associadas ao atributo. Propriedades em Python: Contribuem para manter a integridade dos objetos e aplicar o princípio de encapsulamento. Integridade dos objetos: encapsulamento Atributos de classe Atributos de Classe: São usados para controlar valores associados à classe, não às instâncias. Exemplo: Ao criar uma classe "Círculo," podemos adicionar um atributo de classe "total_circulos" para contar o número de círculos criados. Declaração: A variável de classe é criada na classe e pode ser atualizada para rastrear informações compartilhadas entre todas as instâncias da classe. Privacidade: É uma boa prática tornar o atributo de classe privado usando um underscore (ex: _total_circulos) para evitar acesso direto. Integridade dos objetos: encapsulamento Métodos de classe Métodos de Classe: São usados para acessar os atributos de classe e têm acesso direto à área de memória que contém esses atributos. Decorator @classmethod: Utilizado para definir um método como estático, permitindo o acesso aos atributos de classe. Exemplo: Na classe "Círculo," o método @classmethod permite acessar o atributo de classe _total_circulos. Parâmetro cls: É criado como uma referência para a classe e é usado dentro do método de classe para acessar os atributos da classe. Integridade dos objetos: encapsulamento Métodos públicos e privados ▪ Métodos públicos e privados seguem as mesmas regras dos atributos. ▪ Métodos privados são marcados com dois underscores antes do nome (ex: __metodo_privado). ▪ Embora métodos privados possam ser chamados diretamente, a boa prática é usá-los apenas internamente para manter o encapsulamento. Integridade dos objetos: encapsulamento Métodos estáticos Métodos Estáticos: São métodos que podem ser chamados sem a necessidade de criar uma instância da classe. Exemplo: O método sqrt da classe Math pode ser chamado diretamente, sem instanciar um objeto da classe. Boa Prática: Em programação orientada a objetos, métodos estáticosnão são recomendados e devem ser usados apenas em casos especiais, como em classes de log em sistemas. Herança e polimorfismo ▪ Herança: Permite que uma classe filho herde métodos e atributos da classe pai, reduzindo repetições de código. ▪ Polimorfismo: Permite que objetos tenham comportamentos específicos em situações diferentes. ▪ Tratamento de Exceções: Facilita a manipulação de erros durante a execução do código, tornando-o mais robusto e controlado. Implementando herança ▪ Herança em POO: Facilita a reutilização de código e a extensão para atender a diferentes regras de negócio. ▪ Exemplo de Conta Especial: Uma classe ContaEspecial herda da classe Conta, permitindo saques com limite. ▪ Vantagens: Redução de duplicação de código e manutenção mais simples. ▪ Código Demonstrado: A implementação mostra a criação e operação de objetos ContaEspecial derivados de Conta. Herança Conta -> ContaEspecial. Herança múltipla Herança Múltipla: Permite que uma classe herde o código de duas ou mais superclasses, combinando suas funcionalidades. Exemplo: No sistema bancário, é criada uma classe ContaRemuneradaPoupanca que herda funcionalidades de Conta e Poupanca. Nova Funcionalidade: A classe ContaRemuneradaPoupanca tem um rendimento diário baseado na poupança e cobra uma taxa de manutenção mensal. Implementação: O código demonstra a criação de objetos e operações em classes derivadas de várias superclasses. Herança múltipla Herança múltipla. Implementando polimorfismo Polimorfismo: Permite métodos com o mesmo nome se comportarem de maneira diferente conforme o objeto que os chama. Exemplo Bancário: Classes ContaCliente, ContaComum e ContaRenumerada possuem regras específicas para calcular rendimento. Uso de Herança: Todas as classes são do tipo ContaCliente, permitindo que o Banco adicione contas de tipos diferentes. Benefícios: Polimorfismo simplifica o código, evita verificações de tipos e torna a chamada de métodos transparente em sistemas com muitas subclasses. Classes abstratas Classes Abstratas: Não podem ser instanciadas e servem como modelos para subclasses concretas. Herança e Abstração: Utiliza-se o módulo abc em Python para criar classes abstratas herdando da classe ABC. Método Abstrato: Uma classe abstrata deve conter pelo menos um método abstrato, indicado com @abstractmethod. Subclasses Concretas: Subclasses como ContaComum e ContaVIP devem fornecer a implementação concreta do método abstrato da superclasse ContaCliente. Classes abstratas Diagrama de classes abstratas. Tratamento de exceções ▪ Tratamento de Exceções em Python: Permite criar exceções personalizadas herdando de Exception. ▪ Exemplo: O código define a exceção ExcecaoCustomizada e a captura usando try...except. ▪ Herança de Exceções: É uma prática comum herdar exceções da classe Exception para distinguir erros da aplicação dos erros padrão da linguagem.