Agora que já sabes como definir classes e instanciar objetos, vamos aprofundar a compreensão sobre os atributos e métodos das classes. Os atributos guardam o estado do objeto, enquanto os métodos permitem que o objeto execute ações ou manipule os seus atributos. Neste capítulo, vais aprender a definir e usar diferentes tipos de atributos e métodos numa classe.
Objetivos
- Compreender a diferença entre atributos de instância e atributos de classe.
- Definir métodos numa classe e entender como eles interagem com os atributos.
- Explorar a inicialização de atributos com o método
__init__()e métodos adicionais.
Atributos de Instância
Os atributos de instância são variáveis associadas a cada objeto (instância) de uma classe. Quando crias um objeto, esses atributos podem ter valores diferentes para cada instância. Cada objeto tem o seu próprio conjunto de atributos, o que significa que os valores de um objeto não afetam os valores de outro.
Normalmente, os atributos de instância são definidos dentro do método __init__() da classe, que é o método especial chamado automaticamente quando um novo objeto é criado. Os atributos de instância são acedidos através da palavra-chave self, que representa o próprio objeto.
Exemplo de Atributos de Instância:
# Definir uma classe com atributos de instância
class Carro:
def __init__(self, marca, modelo, ano):
self.marca = marca # Atributo de instância
self.modelo = modelo # Atributo de instância
self.ano = ano # Atributo de instância
# Criar dois objetos com valores diferentes para os atributos
carro1 = Carro("Toyota", "Corolla", 2020)
carro2 = Carro("Honda", "Civic", 2018)
# Aceder aos atributos de instância de cada objeto
print(f"Carro 1: {carro1.marca}, {carro1.modelo}, {carro1.ano}")
print(f"Carro 2: {carro2.marca}, {carro2.modelo}, {carro2.ano}")
No exemplo acima, a classe Carro tem três atributos de instância: marca, modelo e ano. Cada objeto criado (neste caso, carro1 e carro2) tem os seus próprios valores para esses atributos.
Atributos de Classe
Os atributos de classe são partilhados por todas as instâncias da classe. Ao contrário dos atributos de instância, que são únicos para cada objeto, os atributos de classe são comuns a todos os objetos e são definidos diretamente na classe, fora do método __init__(). Podem ser acedidos tanto pela classe quanto pelos objetos.
Exemplo de Atributo de Classe:
# Definir uma classe com atributos de classe e de instância
class Carro:
num_rodas = 4 # Atributo de classe, comum a todos os carros
def __init__(self, marca, modelo, ano):
self.marca = marca # Atributo de instância
self.modelo = modelo # Atributo de instância
self.ano = ano # Atributo de instância
# Criar dois objetos da classe Carro
carro1 = Carro("Toyota", "Corolla", 2020)
carro2 = Carro("Honda", "Civic", 2018)
# Aceder ao atributo de classe a partir de um objeto
print(f"O {carro1.marca} tem {carro1.num_rodas} rodas.")
# Aceder ao atributo de classe diretamente da classe
print(f"Todos os carros têm {Carro.num_rodas} rodas.")
No exemplo acima, o atributo num_rodas é um atributo de classe. Isto significa que todos os objetos da classe Carro partilham esse atributo. Não importa quantos objetos criemos, todos terão o valor num_rodas = 4.
Métodos de Instância
Os métodos de instância são funções definidas dentro de uma classe que operam sobre os atributos de instância. Estes métodos requerem que um objeto seja instanciado para poderem ser usados, e o primeiro argumento de qualquer método de instância é sempre self, que representa o próprio objeto.
Exemplo de Métodos de Instância:
# Definir uma classe com um método de instância
class Carro:
def __init__(self, marca, modelo, ano):
self.marca = marca
self.modelo = modelo
self.ano = ano
def acelerar(self): # Método de instância
print(f"O {self.marca} {self.modelo} está a acelerar!")
# Criar um objeto da classe Carro
meu_carro = Carro("Toyota", "Corolla", 2020)
# Chamar o método de instância
meu_carro.acelerar()
No exemplo acima, o método acelerar() é um método de instância que utiliza o atributo marca e modelo do objeto. Quando chamamos o método num objeto, ele utiliza os valores específicos desse objeto.
Inicialização com __init__()
O método __init__() é um método especial chamado sempre que um novo objeto é criado. A função principal de __init__() é inicializar os atributos do objeto. Este método recebe automaticamente o argumento self, que representa o objeto que está a ser criado, e pode receber outros parâmetros que são usados para definir os valores iniciais dos atributos do objeto.
Exemplo de Inicialização com __init__():
# Definir uma classe com inicialização no método __init__
class Pessoa:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
def apresentar(self):
print(f"Olá, o meu nome é {self.nome} e tenho {self.idade} anos.")
# Criar um objeto da classe Pessoa
pessoa1 = Pessoa("João", 30)
# Chamar o método de instância
pessoa1.apresentar()
Aqui, o método __init__() é utilizado para inicializar os atributos nome e idade no momento em que o objeto pessoa1 é criado. O método apresentar() utiliza esses atributos para apresentar a pessoa.
Exercício Prático
A empresa PyTalento pediu-te que desenvolvas uma classe "Estudante" que represente um estudante com atributos como o nome, a idade e uma lista de notas. A classe deve incluir métodos para calcular a média das notas e verificar se o estudante está aprovado (média superior ou igual a 10).
Requisitos:
- Define uma classe "Estudante" com os atributos
nome,idadeenotas. - Cria um método
calcular_media()que devolve a média das notas do estudante. - Cria um método
esta_aprovado()que devolveTruese a média for superior ou igual a 10 eFalsecaso contrário.
Exemplo de Código para Começares:
# Definir a classe Estudante
class Estudante:
def __init__(self, nome, idade, notas):
self.nome = nome
self.idade = idade
self.notas = notas
def calcular_media(self):
return sum(self.notas) / len(self.notas)
def esta_aprovado(self):
return self.calcular_media() >= 10
# Criar um objeto da classe Estudante
estudante1 = Estudante("Ana", 20, [15, 12, 8, 10])
# Imprimir a média e verificar se está aprovado
print(f"Média: {estudante1.calcular_media()}")
print(f"Está aprovado? {estudante1.esta_aprovado()}")