Para consolidar os conhecimentos sobre Programação Orientada a Objetos (POO) em Python, vamos desenvolver um projeto prático: um sistema de gestão de animais. Este sistema permitirá gerir informações sobre animais e os seus donos, utilizando conceitos como classes, herança, encapsulamento e polimorfismo. Vamos começar com o planeamento do projeto e, em seguida, desenvolver o código passo a passo.
Planeamento do Projeto
O sistema de gestão de animais terá as seguintes funcionalidades:
- Adicionar, remover e mostrar animais.
- Adicionar, remover e mostrar donos.
- Associar animais a donos.
- Utilizar herança para diferenciar tipos de animais (cães e gatos).
- Encapsulamento para proteger os dados sensíveis.
Estrutura de Classes
Vamos definir as seguintes classes:
-
Animal
: Classe base para todos os animais. -
Cao
eGato
: Subclasses que herdam deAnimal
. -
Dono
: Para gerir as informações dos donos. -
SistemaGestao
: Para gerir as funcionalidades do sistema.
Implementação do Projeto
Classe Animal
class Animal:
def __init__(self, nome, idade, especie):
self._nome = nome
self._idade = idade
self._especie = especie
def get_nome(self):
return self._nome
def get_idade(self):
return self._idade
def set_idade(self, idade):
if idade > 0:
self._idade = idade
def __str__(self):
return f'{self._nome}, {self._idade} anos, {self._especie}'
Subclasses Cao e Gato
class Cao(Animal):
def __init__(self, nome, idade, raca):
super().__init__(nome, idade, 'Cao')
self._raca = raca
def __str__(self):
return super().__str__() + f', {self._raca}'
class Gato(Animal):
def __init__(self, nome, idade, pelo):
super().__init__(nome, idade, 'Gato')
self._pelo = pelo
def __str__(self):
return super().__str__() + f', pelo {self._pelo}'
Classe Dono
class Dono:
def __init__(self, nome, contacto):
self._nome = nome
self._contacto = contacto
self._animais = []
def adicionar_animal(self, animal):
if animal not in self._animais:
self._animais.append(animal)
def remover_animal(self, animal):
if animal in self._animais:
self._animais.remove(animal)
def get_lista_animais(self):
return [str(animal) for animal in self._animais]
def __str__(self):
return f'{self._nome}, Contacto: {self._contacto}'
Classe SistemaGestao
class SistemaGestao:
def __init__(self):
self._donos = {}
self._animais = []
def adicionar_dono(self, nome, contacto):
if nome not in self._donos:
self._donos[nome] = Dono(nome, contacto)
def remover_dono(self, nome):
if nome in self._donos:
del self._donos[nome]
def adicionar_animal(self, tipo, nome, idade, caracteristica):
if tipo == "Cao":
animal = Cao(nome, idade, caracteristica)
elif tipo == "Gato":
animal = Gato(nome, idade, caracteristica)
self._animais.append(animal)
return animal
def associar_animal_a_dono(self, nome_dono, animal):
if nome_dono in self._donos:
self._donos[nome_dono].adicionar_animal(animal)
def mostrar_donos(self):
return [str(dono) for dono in self._donos.values()]
def mostrar_animais(self):
return [str(animal) for animal in self._animais]
Exemplo de Utilização
sistema = SistemaGestao()
# Adicionar donos
sistema.adicionar_dono("João", "912345678")
sistema.adicionar_dono("Maria", "987654321")
# Adicionar animais
cao1 = sistema.adicionar_animal("Cao", "Rex", 5, "Labrador")
gato1 = sistema.adicionar_animal("Gato", "Mimi", 3, "Curto")
# Associar animais a donos
sistema.associar_animal_a_dono("João", cao1)
sistema.associar_animal_a_dono("Maria", gato1)
# Mostrar donos e animais
print("Donos:")
for dono in sistema.mostrar_donos():
print(dono)
print("\nAnimais:")
for animal in sistema.mostrar_animais():
print(animal)
Resumo
Neste capítulo, desenvolvemos um sistema de gestão de animais utilizando conceitos de Programação Orientada a Objetos em Python. Definimos várias classes e implementámos funcionalidades práticas como adicionar e mostrar animais e donos. Também demonstrámos como encapsular dados e criar herança entre classes.
Quiz
1. O que é encapsulamento e como foi implementado no sistema de gestão de animais?
2. Como se define herança em Python? Justifique com um exemplo do código.
3. Explique a diferença entre métodos de instância e métodos de classe, e dê um exemplo de cada da implementação deste capítulo.
4. Qual é a finalidade da classe SistemaGestao
e como ela usa outras classes para gerir o sistema?
5. Que melhoria(s) pode realizar no sistema para aumentar a sua funcionalidade?