Métodos de Classe

Métodos de classe são uma parte fundamental da programação orientada a objetos, permitindo que possamos manipular dados pertencentes à classe como um todo, em vez de dados pertencentes às instâncias individuais. Nesta secção, vamos explorar o que são métodos de classe, como os definir e quando utilizá-los através de exemplos práticos.

O que são Métodos de Classe?

Métodos de classe são métodos que são vinculados à classe e não a instâncias da classe. Diferentemente dos métodos de instância, que operam nos atributos de uma instância específica, métodos de classe operam em atributos de classe, que são partilhados por todas as instâncias da classe.

Definindo Métodos de Classe

Para definir um método de classe em Python, utilizamos o decorador @classmethod. A assinatura de um método de classe inclui cls como seu primeiro parâmetro, que é uma referência para a classe em si (similar ao self que se usa nos métodos de instância).

Exemplo:

class Carro:
    total_carros = 0  # Atributo de classe

    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo
        Carro.total_carros += 1
    
    @classmethod
    def mostrar_total_carros(cls):
        print(f"Número total de carros: {cls.total_carros}")

# Criação de instâncias da classe Carro
carro1 = Carro("Toyota", "Corolla")
carro2 = Carro("Honda", "Civic")

# Chamada ao método de classe
Carro.mostrar_total_carros()

# Output: Número total de carros: 2

Quando Utilizar Métodos de Classe?

Métodos de classe são úteis quando precisamos alterar ou obter informações que afetam toda a classe como um todo, em vez de elementos individuais. Eis algumas situações comuns:

  1. Manipular atributos de classe: Como no exemplo acima, onde acompanham o total de instâncias criadas.
  2. Criar alternativas de construção: Métodos de classe também podem ser utilizados para fornecer formas alternativas de criar instâncias da classe.

Exemplo de Método de Construção Alternativo:

class Date:
    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano
    
    @classmethod
    def from_string(cls, data_str):
        dia, mes, ano = map(int, data_str.split("-"))
        return cls(dia, mes, ano)

# Criação de instância usando método alternativo
data = Date.from_string("31-12-2023")

print(data.dia, data.mes, data.ano)  # Output: 31 12 2023

Diferença entre Métodos de Instância, Classe e Estáticos

Para melhor compreensão dos métodos de classe, é útil compará-los com métodos de instância e métodos estáticos:

  • Métodos de instância: Usam o prefixo ‘self’ e operam sobre a instância atual.
  • Métodos de classe: Usam o prefixo ‘cls’ e operam sobre a classe.
  • Métodos estáticos: Não usam nem ‘self’ nem ‘cls’ e não modificam a instância nem a classe. Usam-se apenas como funções normais dentro da classe.

Exemplo Completo

Para consolidar esses conceitos, vejamos um exemplo que utiliza todos os três tipos de métodos:

class Biblioteca:
    total_livros = 0

    def __init__(self, nome):
        self.nome = nome
        self.livros = []
        Biblioteca.total_livros += 1

    def adicionar_livro(self, livro):
        self.livros.append(livro)

    @classmethod
    def mostrar_total_bibliotecas(cls):
        print(f"Total de bibliotecas: {cls.total_livros}")

    @staticmethod
    def biblioteca_info():
        print("As bibliotecas são uma coleção organizada de livros e outros materiais de referência.")

# Usando os métodos
biblioteca1 = Biblioteca("Central")
biblioteca1.adicionar_livro("Python 101")

Biblioteca.mostrar_total_bibliotecas()  # Metodo de Classe
Biblioteca.biblioteca_info()  # Metodo Estático

Resumo

Nesta secção, vimos como os métodos de classe diferem dos métodos de instância e dos métodos estáticos, e explorámos como e quando utilizá-los. Métodos de classe são particularmente úteis para operações que afectam toda a classe, e podem ser usados para fornecer alternativas de construção de instâncias. Assegure-se de praticar com estes conceitos para fortalecer a sua compreensão.

Quiz

  1. O que é um método de classe?

    • A. Um método que pertence a uma instância específica de uma classe.
    • B. Um método que pertence à classe como um todo.
    • C. Um método que não pode modificar nem a classe nem a instância.
  2. Qual é o prefixo padrão utilizado no método de classe em Python?

    • A. self
    • B. cls
    • C. class
  3. Qual dos seguintes não é uma característica dos métodos de classe?

    • A. Podem manipular atributos de classe.
    • B. Executam-se sobre instâncias específicas da classe.
    • C. São definidos utilizando o decorador @classmethod.
  4. Os métodos de classe são úteis para:

    • A. Operações que afetam apenas instâncias específicas.
    • B. Fornecer formas alternativas de construir instâncias.
    • C. Operações que dependem de atributos de instância.

Respostas: 1-B, 2-B, 3-B, 4-B

<< Métodos de Instância Índice Métodos Estáticos >>