Guia de estudo

29/04/2026 · Aula 07

Herança

Reuso e Especialização

Programação Orientada a Objetos com Python
Tecnologia em Análise e Desenvolvimento de Sistemas

4 horas Teoria + Prática class Filho(Pai) Veiculo > Carro > Moto > Caminhão

agenda de hoje

O que vamos construir hoje

01

01 · O conceito É UM

Entender por que herança é sobre especialização e não apenas copiar código.

02

02 · A Sintaxe e super()

Como declarar o parentesco e delegar tarefas para o pai via super().

03

03 · Hierarquia Real

Construção passo a passo da hierarquia de Veículos e o desafio de RH.

motivação

O problema: Código Duplicado 😩

  • 🚗 Carro: marca, modelo, ano, ligar(), desligar()
  • 🏍️ Moto: marca, modelo, ano, ligar(), desligar()
  • 🚚 Caminhão: marca, modelo, ano, ligar(), desligar()

A Solução

Defina o comportamento comum uma única vez no pai. As filhas herdam tudo e focam apenas no que as torna únicas.

fundamento

A Relação "É UM"

🚗

Carro É UM Veículo

Tem motor e rodas, mas adiciona portas e porta-malas.

👨‍💼

Gerente É UM Funcionário

Recebe salário, mas adiciona bônus e equipe.

🐕

Cachorro É UM Animal

Respira e come, mas adiciona latido e raça.

Se a resposta for 'Tem um' (Carro tem motor), use Composição. Se for 'É um', use Herança.

sintaxe básica

Declarando Parentesco

Em Python, a herança é declarada passando o pai entre parênteses. A filha nasce com 100% do DNA do pai.

heranca.py
class Veiculo:
    def __init__(self, marca):
        self.marca = marca

    def buzinar(self):
        print("Beep beep!")

class Carro(Veiculo): # Carro herda de Veiculo
    pass

meu_carro = Carro("Toyota")
meu_carro.buzinar() # Herdado! Beep beep!

o poder do super()

super() — Delegando para o pai

O super() evita que você repita código. O pai cuida do que é dele.

super_uso.py
class Veiculo:
    def __init__(self, marca, modelo):
        self.marca  = marca
        self.modelo = modelo

class Carro(Veiculo):
    def __init__(self, marca, modelo, portas):
        # Chama o construtor do pai primeiro!
        super().__init__(marca, modelo)
        self.portas = portas # Atributo exclusivo da filha
Regra de ouro: chame super().__init__ sempre na primeira linha do construtor da filha.

prática guiada · parte 1

A Classe Base: Veiculo

Vamos criar o pai de todos, com as regras de negócio comuns.

veiculos.py
class Veiculo:
    _total = 0

    def __init__(self, marca, modelo, ano):
        self.marca  = marca
        self.modelo = modelo
        self.ano    = ano
        self.ligado = False
        Veiculo._total += 1

    def ligar(self):
        self.ligado = True
        print(f"{self.modelo} ligado.")

    def __str__(self):
        status = "ON" if self.ligado else "OFF"
        return f"{self.marca} {self.modelo} ({self.ano}) - {status}"

prática guiada · parte 2

Especializando: Carro

O Carro herda de Veiculo e adiciona o controle de portas.

veiculos.py
class Carro(Veiculo):
    def __init__(self, marca, modelo, ano, portas=4):
        super().__init__(marca, modelo, ano)
        self.portas = portas

    def abrir_porta(self):
        print(f"Abrindo {self.portas} portas do {self.modelo}.")

    def __str__(self):
        base = super().__str__()
        return f"{base} | {self.portas} portas"

prática guiada · parte 3

Especializando: Moto

A Moto herda do mesmo pai, mas tem comportamentos diferentes.

veiculos.py
class Moto(Veiculo):
    def __init__(self, marca, modelo, ano, cilindradas):
        super().__init__(marca, modelo, ano)
        self.cilindradas = cilindradas

    def empinar(self):
        if self.ligado:
            print(f"RANDANDAN! {self.modelo} no grau!")
        else:
            print("Ligue a moto primeiro!")

    def __str__(self):
        base = super().__str__()
        return f"{base} | {self.cilindradas}cc"

prática guiada · parte 4

Especializando: Caminhão

O Caminhão herda de Veiculo e adiciona controle de carga máxima.

veiculos.py
class Caminhao(Veiculo):
    def __init__(self, marca, modelo, ano, carga_maxima):
        super().__init__(marca, modelo, ano)
        self.carga_maxima = carga_maxima # em toneladas

    def carregar(self, peso):
        if peso > self.carga_maxima:
            print(f"⚠️ Excesso de peso! Limite: {self.carga_maxima}t")
        else:
            print(f"📦 Carregando {peso}t no {self.modelo}.")

    def __str__(self):
        base = super().__str__()
        return f"{base} | Carga Max: {self.carga_maxima}t"

visão geral

Hierarquia em Ação

Veja como o código fica limpo quando o pai absorve o trabalho pesado.

Herdado (de Veiculo)

  • · Atributo marca/modelo
  • · Método ligar()
  • · Atributo ligado
  • · Contagem total

Exclusivo (da Filha)

  • · portas (Carro)
  • · cilindradas (Moto)
  • · carga_maxima (Caminhão)
  • · abrir_porta(), empinar(), carregar()

exercício em aula

Desafio: RH da Empresa

  • 👤 Funcionario (Pai): nome, cpf, salario base. Método exibir().
  • 👔 Gerente (Filha): departamento e bônus. Método calcular_bonus().

Regra

O Gerente deve ganhar o salário base + bônus de 15% no seu método específico.

desafio RH · passo 1

Implementando a Base: Funcionario

Começamos pelo 'pai'. Ele define o que é comum a qualquer trabalhador da empresa.

rh.py
class Funcionario:
    def __init__(self, nome, salario_base):
        self.nome = nome
        self.salario_base = salario_base

    def exibir_dados(self):
        return f"Func: {self.nome} | Salário: R$ {self.salario_base:.2f}"

desafio RH · passo 2

Especializando: Gerente

O Gerente 'É UM' funcionário, mas tem um departamento e um bônus.

rh.py
class Gerente(Funcionario):
    def __init__(self, nome, salario_base, departamento):
        # Delegamos nome e salário para o pai!
        super().__init__(nome, salario_base)
        self.departamento = departamento

    def calcular_bonus(self):
        # Regra: 15% do salário base
        return self.salario_base * 0.15

desafio RH · passo 3

Sobrescrita (Override) Inteligente

Vamos usar o super() para construir um relatório que soma os dados do pai com os do filho.

rh.py
    def exibir_dados(self):
        # 1. Pegamos a string base do pai
        base = super().exibir_dados()
        # 2. Calculamos o valor final
        total = self.salario_base + self.calcular_bonus()
        # 3. Retornamos tudo combinado
        return f"{base} | Depto: {self.departamento} | Total: R$ {total:.2f}"

desafio RH · passo 4

Execução e Resultados

Comparando o comportamento de um funcionário comum vs. um gerente.

rh.py
f1 = Funcionario("Carlos", 2500)
g1 = Gerente("Marta", 6000, "Vendas")

print(f1.exibir_dados())
# Saída: Func: Carlos | Salário: R$ 2500.00

print(g1.exibir_dados())
# Saída: Func: Marta | Salário: R$ 6000.00 | Depto: Vendas | Total: R$ 6900.00

atenção

Erros comuns com Herança

1

Esquecer o super()

Se a filha tem __init__, ela apaga o do pai. Sem super, os atributos do pai não existirão.

2

Passar os argumentos errados

O super().__init__(...) precisa receber exatamente o que o pai pede.

3

Herança por preguiça

Usar herança só pra ganhar métodos, mesmo que a relação não seja 'É UM'.

fechamento

O que dominamos hoje

  • Herança — especializar classes sem repetir código
  • Relação É UM — o teste definitivo para herança
  • super() — invocar a inteligência da classe pai
  • Especialização — adicionar atributos e métodos únicos nas filhas
  • Sobrescrita — modificar comportamentos do pai na filha

para casa

15 exercícios gradativos

Hora de fixar o conceito de hierarquia.

4

Fácil

Exercícios: 1 ao 4

5

Médio

Exercícios: 5 ao 9

4

Difícil

Exercícios: 10 ao 13

2

Avançado

Exercícios: 14 e 15

exercícios para casa · nível fácil

Nível Fácil

01

Pai e Filho Simples

Demonstre a herança básica: Crie uma classe Pai com um método mensagem() que imprime uma saudação. Crie a classe Filho que herda de Pai e use pass para provar que o filho já nasce sabendo saudar.

02

Animal que emite som

Crie uma classe base Animal com o atributo nome e o método emitir_som(). Em seguida, crie a classe Cachorro herdando dela. O objetivo é garantir que o cachorro acesse o nome definido no pai.

03

Equipamento Eletrônico

Modele um sistema de hardware: Crie Equipamento com os atributos tensao e ligado. Crie Computador herdando dele e adicionando memoria_ram. Verifique se o computador possui os 3 atributos.

04

Forma e Círculo

Geometria básica: Crie a classe Forma que define apenas a cor. Crie a classe Circulo que herda essa cor e especializa o objeto adicionando o atributo raio.

exercícios para casa · nível médio

Nível Médio

05

RH: Funcionário e Desenvolvedor

Crie Funcionario (nome, salario). Crie Desenvolvedor que herda dele e adiciona o atributo linguagem_principal. Use obrigatoriamente o super().__init__ para inicializar os dados comuns no pai.

06

Veículos em Cadeia

Teste a herança multinível: Crie Veiculo (marca). Crie Terrestre (herda de Veiculo e adiciona rodas). Crie Carro (herda de Terrestre e adiciona portas). Verifique se o carro possui marca, rodas e portas.

07

Conta e ContaPoupança

Sistemas financeiros: Crie Conta (titular, saldo). Crie ContaPoupanca que adiciona taxa_juros e um método aplicar_juros() que aumenta o saldo atual com base na taxa definida.

08

Loja: Produto e Livro

Gestão de estoque: Crie Produto (nome, preco). Crie Livro que adiciona o atributo autor. Implemente um método __str__ no Livro que exiba o nome, o autor e o preço formatado.

09

Sistema de Login

Controle de acesso: Crie Usuario (username, senha). Crie Admin que herda dele e adiciona nivel_acesso (inteiro). Adicione um método eh_super_admin() que retorna True se o nível for maior que 5.

exercícios para casa · nível difícil

Nível Difícil

10

Encapsulamento + Herança

Segurança de dados: No exercício 07 (Conta), torne o saldo privado (_saldo). Certifique-se de que a ContaPoupanca consiga interagir com o saldo apenas através de métodos ou propriedades protegidas.

11

Restaurante: Prato e Pizza

Composição e Herança: Crie Prato (nome, preco). Crie Pizza que adiciona uma lista de ingredientes (relação de composição). O método __str__ da pizza deve listar o nome e todos os ingredientes.

12

Escola: Pessoa, Aluno e Prof

Agregação e Herança: Crie Pessoa como base. Aluno e Professor herdam dela. O Professor deve possuir uma lista de Alunos (agregação). Crie um método no professor para listar seus alunos.

13

Veículo com Validação

Garantia de integridade: Crie Caminhao herdando de Veiculo. No __init__ do caminhão, valide se a carga_maxima não é negativa antes de chamar o construtor do pai via super.

exercícios para casa · nível avançado

Nível Avançado

14

E-commerce de Eletrônicos

Polimorfismo inicial: Crie Produto base. Crie Smartphone e Notebook com especificações únicas. Crie uma classe Carrinho que aceita qualquer um deles e calcula o valor total da compra.

15

RPG: Herança e Status

Sistemas de jogos: Crie Entidade base (nome, vida). Crie Heroi (adiciona mana) e Inimigo (adiciona drop_xp). Implemente uma lógica de batalha simples onde ambos manipulam os atributos herdados.

próxima aula

Aula 8 · 04/05

Herança — parte 2 + Sobrescrita

Vamos aprender Override avançado, MRO e Herança Múltipla.

Override MRO Herança Múltipla super() avançado