Classes no Python

Usar classes na programação traz benefícios importantes, como a capacidade de reutilizar código e organizar o projeto de forma estruturada. Ao agrupar atributos e métodos relacionados em uma única classe, você cria um código modular que é mais fácil de manter e expandir. Além disso, é possível criar hierarquias de classes usando herança e polimorfismo, o que aumenta a flexibilidade e eficiência do código.

Em programação orientada a objetos, uma classe é uma estrutura de dados que representa um conjunto de objetos com características e ações semelhantes. Ela funciona como uma base para criar instâncias, chamadas de objetos. Cada objeto criado a partir de uma classe possui os atributos e métodos definidos pela classe, mas com valores e estados específicos.

Os atributos (também chamados de propriedades ou campos) representam as características ou dados que um objeto pode ter. Por exemplo, se você tem uma classe Carro, os atributos podem incluir coisas como modelo, cor, ano de fabricação, etc. Já os métodos (funções associadas à classe) são as ações que um objeto pode realizar. Usando o exemplo da classe Carro, métodos poderiam incluir ligar o motor, desligar o motor, acelerar, frear, etc.

Exemplo

Uma pessoa tem algumas características, como nome, altura e massa, e algumas funções/métodos, como saudação, comer, falar. Uma forma de programar isso tudo seria primeiro criar os objetos para depois fazer uso deles no código principal. Dessa forma, somente quando a pessoa decidir usar um método é que ele entra no código principal – diferente de um código mais simples, que roda tudo na sequência.

Em Python, uma classe é definida usando a palavra-chave “class”. Sempre que criar uma classe você vai ter que criar a função __init__ (com 2 underlines no início e no fim) que é a função para iniciar essa classe, ou seja, vai passar todas as características que precisa para criar esse objeto. Essa função deve receber como argumento “self”, que faz referência à classe que foi criada (como ele está dentro da classe Pessoa, ele faz referência ao próprio controle). O uso de “self” também ocorre para cada variável definida nessa mesma função.

class Pessoa:
    # O método __init__ inicializa o objeto com um nome
    def __init__(self, nome):
        self.nome = nome  # Define o atributo nome durante a inicialização
    
    # Método para saudar a pessoa
    def saudacao(self):
        print("Olá, meu nome é", self.nome)

# Criando um objeto da classe Pessoa durante a inicialização
pessoa1 = Pessoa("Alice")

# Chamando o método de saudação
pessoa1.saudacao()  # Saída: Olá, meu nome é Alice

Caso não fizesse uso do método “__init__”, o script ficaria da seguinte forma:

class Pessoa:
    # Atributo da classe
    nome = ""
    
    # Método para definir o nome da pessoa
    def definir_nome(self, nome):
        self.nome = nome
    
    # Método para saudar a pessoa
    def saudacao(self):
        print("Olá, meu nome é", self.nome)

# Criando um objeto da classe Pessoa
pessoa1 = Pessoa()

# Chamando o método para definir o nome
pessoa1.definir_nome("Alice")

# Chamando o método de saudação
pessoa1.saudacao()  # Saída: Olá, meu nome é Alice

Herança

A herança é um conceito importante em programação orientada a objetos, que permite compartilhar atributos e métodos entre classes baseada em um relacionamento hierárquico. A classe derivada (ou subclasse) herda atributos e métodos da classe base (ou superclasse).

Continuando do exemplo já dado, a classe “Pessoa” será considerada como a classe base, sendo a nova classe “Funcionario” uma subclasse de “Pessoa” (no código, aparece como “Funcionario(Pessoa)”):

# Definindo a classe Pessoa
class Pessoa:
    def __init__(self, nome):
        self.nome = nome
    
    def saudacao(self):
        print("Olá, meu nome é", self.nome)

# Definindo a classe Funcionario, que herda de Pessoa
class Funcionario(Pessoa):
    def __init__(self, nome, cargo):
        # Chamando o construtor da classe base (Pessoa) usando super()
        super().__init__(nome)
        self.cargo = cargo
    
    def apresentacao(self):
        # Chamando o método da classe base (Pessoa) usando super()
        super().saudacao()
        print("Eu trabalho como", self.cargo)

# Criando um objeto da classe Funcionario
funcionario1 = Funcionario("Alice", "Engenheira de Software")

# Chamando o método de apresentação da classe Funcionario
funcionario1.apresentacao()

Para definir que uma classe herdará de uma outra classe, precisamos indicar o nome da classe pai entre parênteses após o nome da classe filha. No script, a classe “Funcionario” herda o método “saudacao” da classe “Pessoa” e também possui seu próprio método “apresentacao”. Ao criar um objeto da classe “Funcionario”, ele tem acesso tanto aos métodos da classe “Pessoa” (por meio da herança) quanto aos seus próprios métodos. O método super() é usado para chamar métodos da classe base a partir da subclasse.

Quando você executa esse código, a saída será:

Olá, meu nome é Alice
Eu trabalho como Engenheira de Software

Você pode importar módulos completos de outros arquivos usando a notação “import modulo”, assim como acessar os identificadores usando a notação de ponto (modulo.identificador). A declaração “from … import …” em Python é usada para importar um módulo específico ou um identificador (função, classe ou variável) de um módulo para o namespace atual do seu script ou programa.

Continuando no mesmo exemplo, suponha que a classe “Funcionario” tenha sido escrita no arquivo “funcionario.py”. Em outro arquivo (main.py, por exemplo), você pode importar essa classe usando a seguinte estrutura:

# main.py
from funcionario import Funcionario

# Criando um objeto da classe Funcionario
funcionario1 = Funcionario("Alice", "Engenheira de Software")

# Chamando o método de apresentação da classe Funcionario
funcionario1.apresentacao()

Dessa forma, “from funcionario import Funcionario” importa a classe Funcionario do módulo funcionario (nome do arquivo sem a extensão “.py”). Agora, você pode criar objetos da classe Funcionario e usar seus métodos no arquivo main.py. Isso é útil quando você está trabalhando com vários arquivos Python e deseja reutilizar classes ou funções definidas em um desses arquivos em seu código principal.

Observe que o nome das classes começa com letra maiúscula (inclusive quando há mais de uma palavra). Essa é uma convenção de escrita de código na linguagem, mas não uma obrigatoriedade da sintaxe.

EXTRA

Pedi uma sugestão de ilustração criativa e engraçada para esse post no chatGPT e olha só a resposta:

Aqui está uma ideia para uma imagem criativa e engraçada que ilustra o conceito de classes em Python:

Cenário: Um mundo imaginário onde todos os tipos de animais frequentam uma escola chamada “Escola de Python”. Os animais são divididos em diferentes classes com base em suas características e habilidades.

Imagem: Desenhe uma cena de uma escola, onde você tem uma sala de aula com animais diferentes sentados em mesas. Cada animal representa uma classe em Python. Por exemplo:

1. Cachorro (Classe Base): O cachorro é o aluno exemplar que representa a classe base em Python. Ele está sentado na frente da sala, prestando atenção ao professor. Você pode desenhá-lo usando um boné de formatura para mostrar que ele é o “mestre” da classe base.

2. Gato (Classe Derivada): O gato é um aluno da classe derivada, pois herda algumas características do cachorro, mas também tem suas próprias peculiaridades. Você pode desenhá-lo com óculos e um livro, indicando que ele está aprendendo algo além do básico.

3. Pássaro (Outra Classe Derivada): O pássaro é outro exemplo de uma classe derivada, mas desta vez com algumas características diferentes. Você pode desenhá-lo com asas, representando a capacidade de voar, uma característica que não é compartilhada pelas outras classes.

4. Peixe (Uma Interface): O peixe pode representar uma interface em Python, pois define um conjunto de comportamentos sem implementar qualquer funcionalidade. Você pode desenhá-lo com uma placa escrita “Interface” e um conjunto de regras que os outros animais (classes) devem seguir.

5. Professor (Métodos): O professor na sala de aula representa os métodos em Python que ensinam e guiam os alunos (objetos) sobre como se comportar. O professor pode estar segurando um quadro-negro com código Python escrito nele.

6. Quadro-Negro (Atributos): O quadro-negro na sala de aula representa os atributos em Python. Você pode desenhá-lo com diferentes seções para nome, idade, tipo de animal, etc., mostrando que os atributos podem ser preenchidos com informações específicas para cada objeto (animal).

Esta imagem pode ilustrar de forma divertida como as classes, objetos, herança e interfaces funcionam em Python. Certifique-se de adicionar elementos engraçados e expressões aos animais para tornar a imagem mais cativante e divertida para os leitores do seu post.

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.