0% acharam este documento útil (0 voto)
10 visualizações25 páginas

Apostila Oop Python

aula

Enviado por

Fernando Jhones
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
10 visualizações25 páginas

Apostila Oop Python

aula

Enviado por

Fernando Jhones
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 25

🐍 Apostila: Orientação a Objeto em

Python
Para Iniciantes em Programação

📖 Sumário
1. Introdução

2. Módulo 1: Fundamentos de OOP

3. Módulo 2: Classes e Objetos

4. Módulo 3: Herança

5. Módulo 4: Encapsulamento

6. Módulo 5: Polimorfismo

7. Módulo 6: Projeto Prático

8. Atividade de Múltipla Escolha

Introdução

Bem-vindo ao mundo da Orientação a Objeto (OOP)! Esta apostila foi desenvolvida


para guiá-lo através dos conceitos essenciais de programação orientada a objetos em
Python.

O que você aprenderá?

O que é Orientação a Objeto e por que é importante

Como criar Classes e Objetos

Como usar Herança para reutilizar código

Como proteger dados com Encapsulamento


Como usar Polimorfismo para flexibilidade

Como aplicar esses conceitos em projetos reais

Tempo estimado: 2 horas e 30 minutos

Pré-requisitos

Conhecimento básico de Python (variáveis, tipos de dados, funções)

Ambiente de desenvolvimento configurado (Python + VS Code)

Familiaridade com o terminal/prompt de comando

Módulo 1: Fundamentos de OOP

1.1 O que é Orientação a Objeto?

Orientação a Objeto (OOP) é um paradigma de programação que organiza o código


em torno de objetos e classes, em vez de apenas funções e dados separados.

Paradigmas de Programação

Paradigma Foco Exemplo

Procedural Funções e procedimentos C, Pascal

Funcional Funções puras Lisp, Haskell

Orientado a Objeto Objetos e classes Python, Java, C++

Por que Orientação a Objeto?

✅ Organização: Código mais estruturado e fácil de entender ✅ Reutilização:


Reutilizar código através de herança ✅ Manutenção: Mais fácil de manter e atualizar
✅ Escalabilidade: Funciona bem em projetos grandes ✅ Realismo: Modela o
mundo real de forma natural
1.2 Analogia do Mundo Real: A Fábrica de Carros

Imagine uma fábrica de carros. Para entender OOP, vamos usar essa analogia:

O Molde (Classe)

Uma classe é como um molde ou projeto de um carro. O molde define: - Quais peças
o carro terá (atributos) - O que o carro pode fazer (métodos)

O Carro Produzido (Objeto)

Um objeto é um carro real produzido a partir do molde. Cada carro é uma instância
única, mas segue o mesmo projeto.

Exemplo Visual

┌─────────────────────────┐
│ CLASSE (Molde) │
├─────────────────────────┤
│ Atributos: │
│ - cor │
│ - marca │
│ - velocidade │
│ │
│ Métodos: │
│ - acelerar() │
│ - frear() │
│ - buzinar() │
└─────────────────────────┘
↓ (produz)
┌─────────────────────────┐
│ OBJETO (Carro Real) │
├─────────────────────────┤
│ cor: vermelho │
│ marca: Toyota │
│ velocidade: 0 │
└─────────────────────────┘

1.3 Os 5 Pilares da Orientação a Objeto

1. Classes e Objetos

Classe: Molde ou projeto


Objeto: Instância concreta da classe

2. Herança

Criar novas classes baseadas em classes existentes

Reutilizar código

3. Encapsulamento

Proteger dados dentro da classe

Controlar acesso aos atributos

4. Polimorfismo

Mesma interface, comportamentos diferentes

Flexibilidade no código

5. Abstração

Esconder complexidade

Mostrar apenas o necessário

Módulo 2: Classes e Objetos

2.1 O que é uma Classe?

Uma classe é um molde ou projeto que define a estrutura e o comportamento de


objetos. É como um blueprint para criar objetos.
Componentes de uma Classe

class Carro:
# Atributos (características)
cor = "vermelho"
marca = "Toyota"

# Métodos (ações)
def acelerar(self):
print("O carro está acelerando!")

def frear(self):
print("O carro está freando!")

Anatomia de uma Classe

Parte Função Exemplo

Nome da Classe Identificar a classe Carro

Atributos Características cor , marca

Métodos Ações/comportamentos acelerar() , frear()

2.2 O que é um Objeto?

Um objeto é uma instância concreta de uma classe. É como um carro real produzido a
partir do molde.

Criando um Objeto

# Criar um objeto da classe Carro


meu_carro = Carro()

# Acessar atributos
print(meu_carro.cor) # Saída: vermelho
print(meu_carro.marca) # Saída: Toyota

# Chamar métodos
meu_carro.acelerar() # Saída: O carro está acelerando!
meu_carro.frear() # Saída: O carro está freando!
Múltiplos Objetos da Mesma Classe

carro1 = Carro()
carro2 = Carro()

# Cada objeto é independente


carro1.cor = "azul"
carro2.cor = "preto"

print(carro1.cor) # Saída: azul


print(carro2.cor) # Saída: preto

2.3 Construtores e Inicialização

Um construtor é um método especial que é chamado quando você cria um objeto. Em


Python, o construtor é __init__() .

Exemplo com Construtor

class Carro:
def __init__(self, cor, marca, velocidade_maxima):
self.cor = cor
self.marca = marca
self.velocidade_maxima = velocidade_maxima
self.velocidade_atual = 0

def acelerar(self):
if self.velocidade_atual < self.velocidade_maxima:
self.velocidade_atual += 10
print(f"Velocidade: {self.velocidade_atual} km/h")

def frear(self):
if self.velocidade_atual > 0:
self.velocidade_atual -= 10
print(f"Velocidade: {self.velocidade_atual} km/h")

# Criar objetos com valores iniciais


carro1 = Carro("vermelho", "Toyota", 200)
carro2 = Carro("azul", "Honda", 220)

# Cada objeto tem seus próprios valores


carro1.acelerar() # Saída: Velocidade: 10 km/h
carro2.acelerar() # Saída: Velocidade: 10 km/h

O que é self ?

self é uma referência ao objeto atual. Permite que cada objeto tenha seus próprios
atributos.
class Pessoa:
def __init__(self, nome):
self.nome = nome # self.nome = atributo do objeto

def saudacao(self):
print(f"Olá, meu nome é {self.nome}")

pessoa1 = Pessoa("João")
pessoa2 = Pessoa("Maria")

pessoa1.saudacao() # Saída: Olá, meu nome é João


pessoa2.saudacao() # Saída: Olá, meu nome é Maria

2.4 Atributos e Métodos

Atributos

Atributos são características ou propriedades de um objeto.

class Livro:
def __init__(self, titulo, autor, paginas):
self.titulo = titulo # Atributo
self.autor = autor # Atributo
self.paginas = paginas # Atributo

Métodos

Métodos são ações que um objeto pode realizar.

class Livro:
def __init__(self, titulo, autor, paginas):
self.titulo = titulo
self.autor = autor
self.paginas = paginas
self.pagina_atual = 1

def ler(self, num_paginas):


self.pagina_atual += num_paginas
print(f"Lendo... Página {self.pagina_atual}")

def info(self):
print(f"{self.titulo} por {self.autor}")
print(f"Total de páginas: {self.paginas}")
Módulo 3: Herança

3.1 O que é Herança?

Herança é um mecanismo que permite que uma classe herde características e


comportamentos de outra classe. É como um filho herdar características dos pais.

Analogia: Família

┌─────────────────────┐
│ Classe: Animal │
├─────────────────────┤
│ Atributos: │
│ - nome │
│ - idade │
│ │
│ Métodos: │
│ - fazer_som() │
└─────────────────────┘
↑ (herda)
┌────┴────┐
↓ ↓
┌────────┐ ┌────────┐
│ Cão │ │ Gato │
├────────┤ ├────────┤
│ latir()│ │ miar() │
└────────┘ └────────┘

3.2 Classe Base e Classe Derivada

Classe Base (Superclasse)

A classe base é a classe original que define características comuns.

class Animal:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade

def fazer_som(self):
print(f"{self.nome} faz um som")

def info(self):
print(f"Nome: {self.nome}, Idade: {self.idade}")
Classe Derivada (Subclasse)

A classe derivada herda da classe base e pode adicionar novos comportamentos.

class Cão(Animal):
def fazer_som(self):
print(f"{self.nome} late: Au au!")

def buscar(self):
print(f"{self.nome} está buscando a bola")

class Gato(Animal):
def fazer_som(self):
print(f"{self.nome} mia: Miau!")

def arranhar(self):
print(f"{self.nome} está arranhando o sofá")

Usando Herança

# Criar objetos
dog = Cão("Rex", 5)
cat = Gato("Whiskers", 3)

# Usar métodos herdados


dog.info() # Saída: Nome: Rex, Idade: 5
cat.info() # Saída: Nome: Whiskers, Idade: 3

# Usar métodos específicos


dog.fazer_som() # Saída: Rex late: Au au!
cat.fazer_som() # Saída: Whiskers mia: Miau!

# Usar métodos da subclasse


dog.buscar() # Saída: Rex está buscando a bola
cat.arranhar() # Saída: Whiskers está arranhando o sofá

3.3 Benefícios da Herança

✅ Reutilização de Código: Não precisa repetir código comum ✅ Organização:


Código mais estruturado e lógico ✅ Manutenção: Mudanças na classe base afetam
todas as subclasses ✅ Hierarquia: Modela relacionamentos do mundo real
Módulo 4: Encapsulamento

4.1 O que é Encapsulamento?

Encapsulamento é o princípio de esconder os detalhes internos de uma classe e


fornecer uma interface pública controlada. É como um carro: você não precisa saber
como funciona o motor, apenas como dirigir.

Analogia: Cápsula de Remédio

┌──────────────────────────┐
│ ENCAPSULAMENTO (Cápsula)│
├──────────────────────────┤
│ Dados Privados (dentro) │
│ - ingredientes │
│ - fórmula │
│ │
│ Interface Pública │
│ - tomar() │
│ - dosagem() │
└──────────────────────────┘

4.2 Atributos Privados e Públicos

Atributos Públicos

Podem ser acessados de fora da classe.

class Pessoa:
def __init__(self, nome):
self.nome = nome # Atributo público

Atributos Privados

Começam com _ (convenção) ou __ (mais forte). Não devem ser acessados


diretamente.
class ContaBancaria:
def __init__(self, titular, saldo):
self.titular = titular
self.__saldo = saldo # Atributo privado

def depositar(self, valor):


if valor > 0:
self.__saldo += valor
print(f"Depósito de R${valor} realizado")

def sacar(self, valor):


if valor > 0 and valor <= self.__saldo:
self.__saldo -= valor
print(f"Saque de R${valor} realizado")
else:
print("Saque não permitido")

def get_saldo(self):
return self.__saldo

Usando Encapsulamento

conta = ContaBancaria("João", 1000)

# Acessar através de métodos públicos


conta.depositar(500) # Saída: Depósito de R$500 realizado
conta.sacar(200) # Saída: Saque de R$200 realizado
print(conta.get_saldo()) # Saída: 1300

# Tentar acessar diretamente (não recomendado)


# print(conta.__saldo) # Erro: AttributeError

4.3 Getters e Setters

Getters e Setters são métodos para acessar e modificar atributos privados de forma
controlada.
class Temperatura:
def __init__(self, celsius):
self.__celsius = celsius

# Getter
def get_celsius(self):
return self.__celsius

# Setter com validação


def set_celsius(self, valor):
if -273.15 <= valor: # Validação
self.__celsius = valor
else:
print("Temperatura inválida!")

def get_fahrenheit(self):
return (self.__celsius * 9/5) + 32

# Usar
temp = Temperatura(25)
print(temp.get_celsius()) # Saída: 25
print(temp.get_fahrenheit()) # Saída: 77.0

temp.set_celsius(30)
print(temp.get_celsius()) # Saída: 30

4.4 Benefícios do Encapsulamento

✅ Proteção de Dados: Evita modificações indevidas ✅ Validação: Pode validar


dados antes de atribuir ✅ Flexibilidade: Pode mudar implementação interna sem
afetar o código externo ✅ Segurança: Controla o acesso aos dados

Módulo 5: Polimorfismo

5.1 O que é Polimorfismo?

Polimorfismo significa "muitas formas". É a capacidade de objetos diferentes


responderem ao mesmo comando de formas diferentes.
Analogia: Controle Remoto

┌─────────────────────────┐
│ Controle Remoto │
├─────────────────────────┤
│ Botão: Ligar │
└─────────────────────────┘
↓ (mesmo comando)
┌────┴────┐
↓ ↓
┌────────┐ ┌────────┐
│ TV │ │ Rádio │
├────────┤ ├────────┤
│ Liga │ │ Liga │
│ exibe │ │ toca │
│ vídeo │ │ áudio │
└────────┘ └────────┘

5.2 Polimorfismo com Herança

class Animal:
def fazer_som(self):
pass # Método vazio (será sobrescrito)

class Cão(Animal):
def fazer_som(self):
return "Au au!"

class Gato(Animal):
def fazer_som(self):
return "Miau!"

class Vaca(Animal):
def fazer_som(self):
return "Muuu!"

# Polimorfismo em ação
animais = [Cão(), Gato(), Vaca()]

for animal in animais:


print(animal.fazer_som())
# Saída:
# Au au!
# Miau!
# Muuu!

5.3 Polimorfismo com Duck Typing

Em Python, você não precisa herdar de uma classe para ter polimorfismo. Se um
objeto tem o método, pode ser usado.
class Pato:
def fazer_som(self):
return "Quá quá!"

def nadar(self):
return "Nadando..."

class Pessoa:
def fazer_som(self):
return "Olá!"

def nadar(self):
return "Nadando..."

# Duck typing: Se parece um pato e faz som de pato...


def fazer_barulho(entidade):
print(entidade.fazer_som())

pato = Pato()
pessoa = Pessoa()

fazer_barulho(pato) # Saída: Quá quá!


fazer_barulho(pessoa) # Saída: Olá!

5.4 Benefícios do Polimorfismo

✅ Flexibilidade: Código mais genérico e reutilizável ✅ Extensibilidade: Fácil


adicionar novos tipos ✅ Simplicidade: Menos código duplicado ✅ Manutenção:
Mudanças em um lugar afetam todos

Módulo 6: Projeto Prático

6.1 Sistema de Biblioteca

Vamos criar um sistema de biblioteca que utiliza todos os conceitos aprendidos.


Estrutura do Projeto

Biblioteca/
├── Item (classe base)
│ ├── Livro (herança)
│ ├── Revista (herança)
│ └── DVD (herança)
├── Usuário
├── Empréstimo
└── Biblioteca
Código Completo

from datetime import datetime, timedelta

# Classe base
class Item:
def __init__(self, titulo, autor, ano):
self.titulo = titulo
self.autor = autor
self.ano = ano
self.__disponivel = True

def emprestar(self):
if self.__disponivel:
self.__disponivel = False
return True
return False

def devolver(self):
self.__disponivel = True

def esta_disponivel(self):
return self.__disponivel

def info(self):
status = "Disponível" if self.__disponivel else "Emprestado"
return f"{self.titulo} ({self.ano}) - {status}"

# Subclasses
class Livro(Item):
def __init__(self, titulo, autor, ano, paginas):
super().__init__(titulo, autor, ano)
self.paginas = paginas

def info(self):
base = super().info()
return f"{base} - {self.paginas} páginas"

class Revista(Item):
def __init__(self, titulo, autor, ano, edicao):
super().__init__(titulo, autor, ano)
self.edicao = edicao

def info(self):
base = super().info()
return f"{base} - Edição {self.edicao}"

class DVD(Item):
def __init__(self, titulo, diretor, ano, duracao):
super().__init__(titulo, diretor, ano)
self.duracao = duracao

def info(self):
base = super().info()
return f"{base} - {self.duracao} minutos"

# Classe Usuário
class Usuario:
def __init__(self, nome, email):
self.nome = nome
self.email = email
self.__emprestimos = []

def emprestar_item(self, item):


if item.emprestar():
self.__emprestimos.append(item)
return True
return False

def devolver_item(self, item):


if item in self.__emprestimos:
item.devolver()
self.__emprestimos.remove(item)
return True
return False

def get_emprestimos(self):
return self.__emprestimos

# Classe Biblioteca
class Biblioteca:
def __init__(self, nome):
self.nome = nome
self.__itens = []

def adicionar_item(self, item):


self.__itens.append(item)

def listar_itens(self):
for item in self.__itens:
print(item.info())

def buscar_disponivel(self, titulo):


for item in self.__itens:
if item.titulo == titulo and item.esta_disponivel():
return item
return None

# Usando o sistema
biblioteca = Biblioteca("Biblioteca Central")

# Adicionar itens
livro1 = Livro("1984", "George Orwell", 1949, 328)
livro2 = Livro("O Hobbit", "J.R.R. Tolkien", 1937, 310)
revista1 = Revista("Veja", "Vários", 2024, 1)
dvd1 = DVD("Matrix", "Wachowski", 1999, 136)

biblioteca.adicionar_item(livro1)
biblioteca.adicionar_item(livro2)
biblioteca.adicionar_item(revista1)
biblioteca.adicionar_item(dvd1)

# Listar itens
print("=== Itens na Biblioteca ===")
biblioteca.listar_itens()

# Criar usuário
usuario = Usuario("João", "[email protected]")

# Emprestar item
print("\n=== Empréstimos ===")
livro = biblioteca.buscar_disponivel("1984")
if livro:
usuario.emprestar_item(livro)
print(f"Livro emprestado para {usuario.nome}")

# Listar itens novamente


print("\n=== Itens na Biblioteca (após empréstimo) ===")
biblioteca.listar_itens()
Atividade de Múltipla Escolha

Instruções

Responda às 20 questões abaixo para verificar seu aprendizado. Cada questão tem
apenas uma resposta correta.

Questão 1: O que é Orientação a Objeto?

Um paradigma de programação que organiza o código em torno de:

A) Apenas funções B) Objetos e classes C) Variáveis globais D) Loops e condições

Resposta Correta: B

Questão 2: Qual é a analogia mais apropriada para


uma classe?

A) Um carro real B) Um molde ou projeto C) Uma ferramenta D) Uma instrução

Resposta Correta: B

Questão 3: O que é um objeto?

A) Uma classe B) Uma função C) Uma instância de uma classe D) Um atributo

Resposta Correta: C
Questão 4: Qual é o método especial chamado quando
você cria um objeto em Python?

A) __start__() B) __init__() C) __create__() D) __new__()

Resposta Correta: B

Questão 5: O que é self em Python?

A) Uma variável global B) Uma função C) Uma referência ao objeto atual D) Uma
classe

Resposta Correta: C

Questão 6: Qual é o principal benefício da herança?

A) Aumentar a velocidade do código B) Reduzir o tamanho do arquivo C) Reutilizar


código D) Facilitar a compilação

Resposta Correta: C

Questão 7: Em Python, qual é a sintaxe para criar uma


classe que herda de outra?

A) class Filha : Mãe B) class Filha(Mãe): C) class Filha extends Mãe: D)


class Filha inherits Mãe:

Resposta Correta: B
Questão 8: O que é encapsulamento?

A) Criar múltiplas classes B) Esconder detalhes internos e fornecer interface


controlada C) Usar herança D) Criar objetos

Resposta Correta: B

Questão 9: Como você marca um atributo como


privado em Python?

A) Usar private antes do nome B) Usar _ ou __ antes do nome C) Usar private_


depois do nome D) Não é possível em Python

Resposta Correta: B

Questão 10: O que é um getter?

A) Uma classe B) Um método para obter o valor de um atributo privado C) Uma função
global D) Um tipo de herança

Resposta Correta: B

Questão 11: O que é polimorfismo?

A) Usar múltiplas classes B) A capacidade de objetos diferentes responderem ao


mesmo comando de formas diferentes C) Criar herança D) Usar encapsulamento

Resposta Correta: B
Questão 12: Qual é a analogia mais apropriada para
polimorfismo?

A) Um carro B) Uma classe C) Um controle remoto que funciona com diferentes


aparelhos D) Uma função

Resposta Correta: C

Questão 13: O que é duck typing em Python?

A) Um tipo de herança B) Se parece um pato e faz som de pato, é um pato C) Uma


classe especial D) Um método privado

Resposta Correta: B

Questão 14: Qual é o método usado para chamar um


método da classe pai em Python?

A) parent() B) super() C) inherit() D) base()

Resposta Correta: B

Questão 15: O que é um atributo?

A) Uma ação que um objeto pode realizar B) Uma característica ou propriedade de um


objeto C) Uma classe D) Uma função

Resposta Correta: B
Questão 16: O que é um método?

A) Uma característica de um objeto B) Uma classe C) Uma ação que um objeto pode
realizar D) Um atributo

Resposta Correta: C

Questão 17: Qual é o principal benefício do


encapsulamento?

A) Aumentar a velocidade B) Proteger dados e permitir validação C) Reduzir o código


D) Facilitar a herança

Resposta Correta: B

Questão 18: Em uma hierarquia de classes, qual é a


classe que outras herdam?

A) Classe derivada B) Classe filha C) Classe base ou superclasse D) Classe secundária

Resposta Correta: C

Questão 19: O que acontece quando você cria


múltiplos objetos da mesma classe?

A) Todos compartilham os mesmos atributos B) Cada objeto tem seus próprios


atributos C) Os atributos são compartilhados parcialmente D) Não é possível criar
múltiplos objetos

Resposta Correta: B
Questão 20: Qual é o primeiro passo para usar
Orientação a Objeto em Python?

A) Criar um objeto B) Criar uma classe C) Usar herança D) Usar encapsulamento

Resposta Correta: B
Gabarito Completo

Questão Resposta

1 B

2 B

3 C

4 B

5 C

6 C

7 B

8 B

9 B

10 B

11 B

12 C

13 B

14 B

15 B

16 C

17 B

18 C

19 B

20 B
Como Calcular Sua Nota

Questões Corretas: 20

Valor de cada questão: 1 ponto

Nota Máxima: 20 pontos

Fórmula: (Número de acertos ÷ 20) × 10 = Sua nota

Exemplo: Se você acertou 18 questões: (18 ÷ 20) × 10 = 9.0

Interpretação da Nota

9.0 a 10.0: Excelente! Você dominou OOP

7.0 a 8.9: Muito bom! Você entendeu bem os conceitos

5.0 a 6.9: Bom! Revise os conceitos que teve dúvida

Abaixo de 5.0: Releia a apostila e tente novamente

Próximas Etapas

1. ✅ Verifique suas respostas com o gabarito


2. 📚 Releia os módulos onde teve dúvidas

3. 💻 Pratique os conceitos no seu computador

4. 🚀 Comece a criar seus próprios projetos com OOP

Parabéns por completar esta apostila! Você agora domina os conceitos


fundamentais de Orientação a Objeto em Python! 🎉
Próximos passos: Crie seus próprios projetos, explore bibliotecas Python que
usam OOP e continue aprendendo! 🚀
Apostila desenvolvida para iniciantes em programação Versão 1.0 - 2024

Você também pode gostar