Métodos e atributos

Agora que já abordámos a criação de classes e a sua estrutura, é hora de mergulharmos nos métodos e atributos — dois pilares essenciais na programação orientada a objetos (POO). Este capítulo irá esclarecer como trabalhar com métodos e atributos em Python, utilizando exemplos práticos para cimentar a sua compreensão.

Atributos de Instância

Atributos de instância são variáveis que pertencem a uma instância específica de uma classe. São definidos no método __init__ e têm uma importância crucial na configuração do estado de um objeto. Vejamos um exemplo prático para uma classe Cao:

class Cao:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

meu_cao = Cao("Rex", 5)
print(meu_cao.nome)  # Output: Rex
print(meu_cao.idade)  # Output: 5

Cada instância de Cao terá atributos nome e idade, que são únicos para aquele objeto específico.

Métodos de Instância

Os métodos de instância operam em instâncias da classe e podem aceder e modificar os atributos da instância. Um exemplo típico será um método para fazer o Cao ladrar:

class Cao:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def ladrar(self):
        return f"{self.nome} diz au au!"

meu_cao = Cao("Rex", 5)
print(meu_cao.ladrar())  # Output: Rex diz au au!

Repare como o método ladrar acede ao atributo self.nome.

Atributos e Métodos de Classe

Atributos de classe são variáveis que pertencem à própria classe e são partilhados por todas as instâncias da classe. Considere o exemplo seguinte:

class Cao:
    especie = "Canis lupus familiaris"

    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

print(Cao.especie)  # Output: Canis lupus familiaris
meu_cao = Cao("Rex", 5)
print(meu_cao.especie)  # Output: Canis lupus familiaris

Métodos de classe podem ser definidas utilizando @classmethod. Por exemplo:

class Cao:
    especie = "Canis lupus familiaris"

    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    @classmethod
    def obter_especie(cls):
        return cls.especie

print(Cao.obter_especie())  # Output: Canis lupus familiaris

O método obter_especie pertence à classe e pode ser invocado diretamente pela classe ou pelas instâncias da classe.

Atributos e Métodos Estáticos

Às vezes, precisamos de métodos que não dependem da instância ou da classe, e é aí que os métodos estáticos entram em ação. São definidos usando o decorador @staticmethod:

class Matematica:
    @staticmethod
    def adicionar(a, b):
        return a + b

print(Matematica.adicionar(5, 3))  # Output: 8

Métodos estáticos podem ser chamados diretamente a partir da classe, sem precisar criar uma instância.

Exemplo Prático: Sistema de Biblioteca

Vamos aplicar o que aprendemos num exemplo realista: um sistema de biblioteca. Vamos criar uma classe Livro com métodos e atributos que exemplificam o uso de todos estes conceitos.

class Livro:
    numero_livros = 0
    
    def __init__(self, titulo, autor):
        self.titulo = titulo
        self.autor = autor
        Livro.numero_livros += 1

    def detalhes(self):
        return f"Título: {self.titulo}, Autor: {self.autor}"

    @classmethod
    def total_de_livros(cls):
        return cls.numero_livros

    @staticmethod
    def descricao():
        return "Esta é uma classe que representa livros numa biblioteca."

# Criar instâncias de Livro
livro1 = Livro("O Alquimista", "Paulo Coelho")
livro2 = Livro("1984", "George Orwell")

# Mostrar detalhes dos livros
print(livro1.detalhes())  # Output: Título: O Alquimista, Autor: Paulo Coelho
print(livro2.detalhes())  # Output: Título: 1984, Autor: George Orwell

# Obter o número total de livros
print(Livro.total_de_livros())  # Output: 2

# Mostrar descrição estática
print(Livro.descricao())  # Output: Esta é uma classe que representa livros numa biblioteca.

Neste exemplo, Livro tem atributos de instância (titulo e autor), um atributo de classe (numero_livros), métodos de instância (detalhes), um método de classe (total_de_livros) e um método estático (descricao).

Resumo

Neste capítulo, explorámos os diferentes tipos de métodos e atributos em Python. Aprendemos a criar e utilizar atributos de instância, atributos e métodos de classe e métodos estáticos. Para solidificar o conhecimento, aplicámos estes conceitos em exemplos práticos, incluindo um sistema simples de biblioteca.

Quiz

  1. O que são atributos de instância e onde são normalmente definidos numa classe?
  2. Qual é a principal diferença entre métodos de instância e métodos de classe em Python?
  3. Como se define um método estático numa classe em Python?
  4. Cite um exemplo prático de onde se poderia utilizar um atributo de classe.
  5. O que imprime o seguinte código?
    class Exemplo:
        classe_atributo = 10
    
        def __init__(self, instancia_atributo):
            self.instancia_atributo = instancia_atributo
    
    objeto = Exemplo(20)
    print(objeto.instancia_atributo)
    print(Exemplo.classe_atributo)
    
<< Construtores Índice Decoradores >>