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
- O que são atributos de instância e onde são normalmente definidos numa classe?
- Qual é a principal diferença entre métodos de instância e métodos de classe em Python?
- Como se define um método estático numa classe em Python?
- Cite um exemplo prático de onde se poderia utilizar um atributo de classe.
- 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)