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:
- Manipular atributos de classe: Como no exemplo acima, onde acompanham o total de instâncias criadas.
- 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
-
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.
-
Qual é o prefixo padrão utilizado no método de classe em Python?
- A.
self
- B.
cls
- C.
class
- A.
-
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
.
-
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