Spec Sistemas Com Python • Trilha Progressiva em 4 Níveis


🧭 Navegação Pedagógica


🎯 Nível 1: Fundamentos

Problema 09.1 — Classes Abstratas com abc.ABC e @abstractmethod

Contexto: Classes Abstratas com abc.ABC e @abstractmethod no contexto de Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO.

Requisitos de Execução:

  1. Declarar contrato base abstrato forçando a implementação de métodos nas classes derivadas.

Resultado Esperado

Compilador impede instanciação de classes abstratas sem todos os métodos implementados.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_1_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO
🔑 Gabarito de Código & Solução Comentada
from abc import ABC, abstractmethod

class Notificador(ABC):
    @abstractmethod
    def enviar(self, mensagem: str) -> None:
        pass

class EmailNotificador(Notificador):
    def enviar(self, mensagem: str) -> None:
        print(f"[EMAIL] {mensagem}")

n: Notificador = EmailNotificador()
n.enviar("Servidor online.")

🔍 Nível 2: Prática

Problema 09.2 — Herança Múltipla e Resolução de Ordem de Métodos (MRO)

Contexto: Herança Múltipla e Resolução de Ordem de Métodos (MRO) no contexto de Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO.

Requisitos de Execução:

  1. Inspecionar o Classe.__mro__ para entender o algoritmo C3 Linearization em diamante.

Resultado Esperado

Árvore de herança em diamante resolvida deterministicamente pelo MRO.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_2_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO
🔑 Gabarito de Código & Solução Comentada
class Base:
    def acao(self) -> str: return "Base"

class MixinA(Base):
    def acao(self) -> str: return f"MixinA -> {super().acao()}"

class MixinB(Base):
    def acao(self) -> str: return f"MixinB -> {super().acao()}"

class ServicoFinal(MixinA, MixinB):
    pass

s = ServicoFinal()
print(f"Cadeia MRO: {s.acao()}")

⚡ Nível 3: Integração

Problema 09.3 — Uso Seguro de super() com Passagem Cooperativa de Argumentos

Contexto: Uso Seguro de super() com Passagem Cooperativa de Argumentos no contexto de Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO.

Requisitos de Execução:

  1. Encadeie chamadas de construtores em herança múltipla utilizando super().__init__(**kwargs).

Resultado Esperado

Inicialização cooperativa de classes executada com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_3_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO
🔑 Gabarito de Código & Solução Comentada
class Logavel:
    def __init__(self, **kwargs: object) -> None:
        super().__init__(**kwargs)
        print("Logavel inicializado.")

class Persistivel:
    def __init__(self, **kwargs: object) -> None:
        super().__init__(**kwargs)
        print("Persistivel inicializado.")

class Entidade(Logavel, Persistivel):
    def __init__(self, **kwargs: object) -> None:
        super().__init__(**kwargs)

Entidade()

🏆 Nível 4: Desafio Corporativo

Problema 09.4 — Controle de Subclasses com init_subclass (Hooks de Herança)

Contexto: Controle de Subclasses com init_subclass (Hooks de Herança) no contexto de Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO.

Requisitos de Execução:

  1. Validar e registrar automaticamente subclasses no momento de sua declaração sem necessidade de metaclasses.

Resultado Esperado

Subclasses registradas automaticamente no registro corporativo via `__init_subclass__`.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_4_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Herança, Polimorfismo, Classes Abstratas (abc.ABC) e MRO
🔑 Gabarito de Código & Solução Comentada
REGISTRO_PLUGINS = {}

class PluginBase:
    def __init_subclass__(cls, nome_plugin: str, **kwargs: object) -> None:
        super().__init_subclass__(**kwargs)
        REGISTRO_PLUGINS[nome_plugin] = cls

class AuthPlugin(PluginBase, nome_plugin="AUTH_JWT"):
    pass

print(f"Plugins registrados: {list(REGISTRO_PLUGINS.keys())}")

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos