Prévia do material em texto
Certamente! Vamos explorar um exemplo prático de programação orientada a objetos (POO) em Python, abordando conceitos como classes, objetos, herança, encapsulamento e polimorfismo. Este exemplo vai ilustrar como esses conceitos são aplicados na prática para criar um sistema de gestão de uma biblioteca.
### Exemplo de Programação Orientada a Objetos em Python: Sistema de Biblioteca
#### Definição das Classes
```python
class Livro:
def __init__(self, titulo, autor, isbn):
self.titulo = titulo
self.autor = autor
self.isbn = isbn
self.disponivel = True
def emprestar(self):
if self.disponivel:
self.disponivel = False
print(f'O livro {self.titulo} foi emprestado.')
else:
print(f'O livro {self.titulo} não está disponível no momento.')
def devolver(self):
if not self.disponivel:
self.disponivel = True
print(f'O livro {self.titulo} foi devolvido com sucesso.')
else:
print(f'O livro {self.titulo} já está disponível.')
class LivroDidatico(Livro):
def __init__(self, titulo, autor, isbn, disciplina):
super().__init__(titulo, autor, isbn)
self.disciplina = disciplina
def __str__(self):
return f'{self.titulo}, {self.autor}, {self.disciplina}'
class Usuario:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
self.livros_emprestados = []
def emprestar_livro(self, livro):
if len(self.livros_emprestados) < 3:
livro.emprestar()
self.livros_emprestados.append(livro)
else:
print(f'{self.nome}, você atingiu o limite de livros emprestados.')
def devolver_livro(self, livro):
if livro in self.livros_emprestados:
livro.devolver()
self.livros_emprestados.remove(livro)
else:
print(f'{self.nome}, você não possui este livro emprestado.')
class Bibliotecario:
def cadastrar_livro(self, titulo, autor, isbn, disciplina=None):
if disciplina:
livro = LivroDidatico(titulo, autor, isbn, disciplina)
else:
livro = Livro(titulo, autor, isbn)
return livro
```
#### Utilização das Classes
```python
# Criando instâncias das classes
bibliotecario = Bibliotecario()
livro1 = bibliotecario.cadastrar_livro('Python para Iniciantes', 'John Doe', '978-3-16-148410-0')
livro2 = bibliotecario.cadastrar_livro('Introdução à Programação', 'Jane Smith', '978-3-16-148410-1', 'Ciência da Computação')
usuario1 = Usuario('Alice', 25)
usuario2 = Usuario('Bob', 30)
# Interagindo com o sistema
usuario1.emprestar_livro(livro1)
usuario2.emprestar_livro(livro2)
usuario1.devolver_livro(livro1)
print(f'Livros emprestados por {usuario1.nome}: {", ".join([livro.titulo for livro in usuario1.livros_emprestados])}')
print(f'Livros emprestados por {usuario2.nome}: {", ".join([livro.titulo for livro in usuario2.livros_emprestados])}')
```
### Explicação do Código
1. **Classes:**
- **Livro:** Representa um livro com atributos como título, autor, ISBN e disponibilidade. Métodos como `emprestar()` e `devolver()` são utilizados para alterar o estado de disponibilidade do livro.
- **LivroDidatico:** Subclasse de Livro que adiciona um atributo disciplina. Sobrescreve o método `__str__()` para fornecer uma representação textual personalizada.
- **Usuario:** Representa um usuário da biblioteca com métodos para emprestar e devolver livros, gerenciando uma lista de livros emprestados.
- **Bibliotecario:** Classe responsável por cadastrar novos livros na biblioteca, distinguindo entre livros comuns e didáticos.
2. **Herança:** A classe `LivroDidatico` herda características da classe `Livro`, permitindo reutilizar código e estender funcionalidades específicas para livros didáticos.
3. **Polimorfismo:** O método `emprestar_livro()` em `Usuario` pode lidar com objetos de tipo `Livro` e `LivroDidatico` de maneira transparente, de acordo com a estrutura da POO.
### Conclusão
Este exemplo ilustra como a programação orientada a objetos pode ser aplicada para modelar e implementar sistemas complexos de forma estruturada, organizada e reutilizável. Através da definição de classes, herança, encapsulamento e polimorfismo, desenvolvedores podem criar sistemas robustos como sistemas de gerenciamento de bibliotecas, sistemas de gestão empresarial, jogos e muito mais. Esses princípios não apenas facilitam o desenvolvimento de software, mas também contribuem para sua manutenção e expansão ao longo do tempo.