🧩 Exercícios: Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
Spec Sistemas Com Python • Trilha Progressiva em 4 Níveis
🧭 Navegação Pedagógica
-
📖 Teoria do Capítulo 💻 Exemplos 📊 Slides 🧠 Quiz
🎯 Nível 1: Fundamentos
Problema 10.1 — Definição de Protocol com typing.Protocol (Structural Subtyping)
Contexto: Definição de Protocol com typing.Protocol (Structural Subtyping) no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.
Requisitos de Execução:
- Criar contrato
Renderizavel(Protocol)e passar objetos que implementemrender() -> strsem herança explícita.
Resultado Esperado
Duck typing estático validado pelo Mypy.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_1_SeuNome - Envie na tarefa:
Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol
class Renderizavel(Protocol):
def render(self) -> str:
...
class Botao:
def render(self) -> str:
return "<button>Enviar</button>"
def exibir_na_tela(comp: Renderizavel) -> None:
print("UI Component:", comp.render())
exibir_na_tela(Botao())
🔍 Nível 2: Prática
Problema 10.2 — Protocolos em Runtime com o Decorador @runtime_checkable
Contexto: Protocolos em Runtime com o Decorador @runtime_checkable no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.
Requisitos de Execução:
- Habilitar checagem dinâmica com
isinstance(obj, MeuProtocol)decorando com@runtime_checkable.
Resultado Esperado
Verificação de protocolos realizada dinamicamente em tempo de execução.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_2_SeuNome - Envie na tarefa:
Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol, runtime_checkable
@runtime_checkable
class Fechavel(Protocol):
def fechar(self) -> None:
...
class Conexao:
def fechar(self) -> None:
print("Conexao encerrada.")
c = Conexao()
print(f"Conexao satisfaz Fechavel: {isinstance(c, Fechavel)}")
⚡ Nível 3: Integração
Problema 10.3 — Protocolos Genéricos e Composição de Protocolos
Contexto: Protocolos Genéricos e Composição de Protocolos no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.
Requisitos de Execução:
- Declarar
Repositorio[T](Protocol)com métodos genéricos de busca e persistência.
Resultado Esperado
Contrato genérico de repositório satisfeito por adaptadores de memória e banco.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_3_SeuNome - Envie na tarefa:
Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol, TypeVar
T = TypeVar("T")
class Repositorio(Protocol[T]):
def obter_por_id(self, id: int) -> T | None:
...
class UsuarioMemoriaRepo:
def obter_por_id(self, id: int) -> str | None:
return f"User_{id}"
repo: Repositorio[str] = UsuarioMemoriaRepo()
print(f"Recuperado: {repo.obter_por_id(10)}")
🏆 Nível 4: Desafio Corporativo
Problema 10.4 — Subtipagem Nominal vs Estrutural em Arquitetura Limpa
Contexto: Subtipagem Nominal vs Estrutural em Arquitetura Limpa no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.
Requisitos de Execução:
- Substituir interfaces rígidas por Protocols desacoplando a camada de regras de negócio das bibliotecas externas.
Resultado Esperado
Camadas de domínio 100% desacopladas de drivers e frameworks.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_4_SeuNome - Envie na tarefa:
Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol
class GatewayPagamento(Protocol):
def cobrar(self, valor: float) -> bool:
...
class MockGateway:
def cobrar(self, valor: float) -> bool:
return True
def efetuar_checkout(gateway: GatewayPagamento, total: float) -> str:
return "Sucesso" if gateway.cobrar(total) else "Falha"
print("Checkout:", efetuar_checkout(MockGateway(), 100.0))
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |