Aprendendo Python
Apoio
  • ➡️Aprendendo Python
  • 🕹️O que é python
  • 🎬Primeiro Passo
  • 🔦Indetificadores no Python
  • ❓Operador relacionais
  • 🖱️Comandos do Python
  • 🎏Variáveis e Tipos de Dados
  • 👜Funções
  • 📦Módulos e Pacotes
  • 🤯Exceções e Tratamento de Erros
  • 📋Trabalhando com Arquivos
  • 🚜Programação Orientada a Objetos (POO)
  • 🎬Getters e Setter
  • 🎁Compreensão de Listas (List Comprehension)
  • 📖Manipulação de Strings
  • 📚Bibliotecas Populares
  • 🐼Biblioteca Pandas - Parte 1
  • 🐼Biblioteca Pandas - Parte 2
  • 🎉Decoradores e Geradores
  • ⏱️Trabalhando com Data e Hora
  • 😁Expressões Regulares (Regex)
  • 👩‍🏫Automatização de Tarefas
  • Sobre
    • 😁Sobre a Autora
  • 🏠Blog da Autora
Fornecido por GitBook
Nesta página

Programação Orientada a Objetos (POO)

AnteriorTrabalhando com ArquivosPróximoGetters e Setter

Atualizado há 6 meses

A Programação Orientada a Objetos (POO) é um dos paradigmas mais importantes da programação moderna. Ela permite modelar e organizar o código de maneira estruturada e reutilizável, simulando objetos do mundo real dentro de um programa. Python é uma linguagem que suporta POO, e entender como usá-la efetivamente é crucial para o desenvolvimento de softwares mais robustos e escaláveis.

Neste capítulo, você vai aprender os conceitos fundamentais da POO em Python, como classes, objetos, atributos, métodos, e também sobre os princípios de encapsulamento, herança e polimorfismo.

Conceitos Básicos

  1. Classe: Uma classe é um modelo, ou um blueprint, que define um tipo de objeto. Ela descreve os atributos (dados) e os comportamentos (métodos) que os objetos desse tipo terão.

  2. Objeto: Um objeto é uma instância de uma classe. Quando criamos um objeto, estamos utilizando a estrutura da classe para gerar uma entidade com características próprias.

  3. Atributos: Atributos são variáveis associadas a uma classe ou a um objeto. Eles representam as características que o objeto terá.

  4. Métodos: Métodos são funções definidas dentro de uma classe, que descrevem os comportamentos que os objetos da classe podem realizar.

Criando uma Classe e um Objeto

Em Python, podemos definir uma classe usando a palavra-chave class. Abaixo, criamos uma classe chamada Cachorro com dois atributos e um método.

class Cachorro:
    def __init__(self, nome, idade):
        self.nome = nome  # Atributo
        self.idade = idade  # Atributo

    def latir(self):  # Método
        print(f"{self.nome} está latindo.")

O método especial __init__() é o construtor da classe. Ele é chamado automaticamente quando criamos um novo objeto, e é responsável por inicializar os atributos do objeto.

Agora, podemos criar um objeto da classe Cachorro e chamar o método latir():

meu_cachorro = Cachorro("Rex", 5)  # Criando um objeto
meu_cachorro.latir()  # Chamando o método latir

Saída:

Rex está latindo.

Atributos de Classe e de Instância

Em Python, existem dois tipos de atributos: atributos de instância e atributos de classe.

  • Atributos de instância: São específicos de cada objeto. No exemplo acima, nome e idade são atributos de instância porque pertencem a um objeto específico.

  • Atributos de classe: São compartilhados entre todas as instâncias da classe.

Exemplo de atributo de classe:

class Cachorro:
    especie = "Canis lupus familiaris"  # Atributo de classe

    def __init__(self, nome, idade):
        self.nome = nome  # Atributo de instância
        self.idade = idade  # Atributo de instância

Todos os objetos da classe Cachorro compartilharão o atributo especie, mas cada um terá seu próprio nome e idade.

Encapsulamento

O encapsulamento é o princípio de ocultar os detalhes internos de um objeto e fornecer uma interface pública para interação. Em Python, utilizamos convenções de nomenclatura para indicar quais atributos e métodos são privados (não devem ser acessados diretamente).

  • Atributos e métodos públicos: Podem ser acessados de fora da classe. Por convenção, não possuem underscore (_).

  • Atributos e métodos privados: Começam com um underscore (_), indicando que são "privados" e não devem ser acessados diretamente.

Exemplo de encapsulamento:

class Pessoa:
    def __init__(self, nome, idade):
        self._nome = nome  # Atributo privado
        self.idade = idade  # Atributo público

    def _falar(self):  # Método privado
        print(f"{self._nome} está falando.")
    
    def apresentar(self):
        print(f"Olá, meu nome é {self._nome} e eu tenho {self.idade} anos.")

Embora _nome e _falar() sejam privados por convenção, ainda podem ser acessados diretamente. No entanto, é uma prática desencorajada, pois esses elementos devem ser manipulados somente por métodos públicos da classe.

Herança

A herança é um princípio que permite criar uma nova classe com base em uma classe existente. A nova classe herda os atributos e métodos da classe pai (ou superclasse), mas também pode adicionar novos comportamentos ou modificar os existentes.

Exemplo de herança:

class Animal:
    def __init__(self, nome):
        self.nome = nome

    def emitir_som(self):
        print("O animal está emitindo um som.")

class Gato(Animal):  # A classe Gato herda de Animal
    def emitir_som(self):
        print(f"O gato {self.nome} está miando.")

Aqui, a classe Gato herda o atributo nome da classe Animal, mas sobrescreve o método emitir_som() para se comportar de maneira diferente.

Polimorfismo

O polimorfismo é a capacidade de diferentes classes implementarem o mesmo método de maneira diferente. No exemplo anterior, vimos que tanto Animal quanto Gato possuem o método emitir_som(), mas com comportamentos distintos.

Podemos explorar o polimorfismo ao tratar diferentes objetos da mesma maneira, mesmo que suas implementações sejam diferentes:

def fazer_animal_emitir_som(animal):
    animal.emitir_som()

gato = Gato("Felix")
animal = Animal("Genérico")

fazer_animal_emitir_som(gato)  # O gato Felix está miando.
fazer_animal_emitir_som(animal)  # O animal está emitindo um som.

Composição

A composição é uma alternativa à herança, em que objetos de uma classe são utilizados como atributos em outra classe. Ela permite que classes compartilhem funcionalidades sem precisar estabelecer uma relação de herança.

Exemplo de composição:

class Motor:
    def ligar(self):
        print("O motor está ligado.")

class Carro:
    def __init__(self):
        self.motor = Motor()  # Composição: Carro tem um motor

    def dirigir(self):
        self.motor.ligar()
        print("O carro está em movimento.")

Aqui, a classe Carro utiliza um objeto da classe Motor como parte de sua composição.

Conclusão

A Programação Orientada a Objetos permite organizar e estruturar seu código de forma mais eficiente, facilitando a reutilização e a manutenção do software. Os conceitos de classes, objetos, herança, polimorfismo, encapsulamento e composição são pilares da POO e proporcionam uma maneira poderosa de modelar problemas complexos no desenvolvimento de software.

🚜
Doe, ajude a continuar criando conteúdo