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


🧭 Navegação Pedagógica


🎯 Nível 1: Fundamentos

Problema 05.1 — Classe com Encapsulamento de Atributos e Decorador @property

Contexto: Classe com Encapsulamento de Atributos e Decorador @property no contexto de POO em Python: Classes, Encapsulamento, Métodos e @property.

Requisitos de Execução:

  1. Criar classe ContaBancaria com atributo privado _saldo e property com validação no setter.

Resultado Esperado

Encapsulamento defensivo aplicado com decorators @property e @saldo.setter.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_1_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - POO em Python: Classes, Encapsulamento, Métodos e @property
🔑 Gabarito de Código & Solução Comentada
class ContaBancaria:
    def __init__(self, titular: str, saldo_inicial: float = 0.0) -> None:
        self.titular = titular
        self._saldo = saldo_inicial

    @property
    def saldo(self) -> float:
        return self._saldo

    @saldo.setter
    def saldo(self, valor: float) -> None:
        if valor < 0:
            raise ValueError("Saldo nao pode ser negativo.")
        self._saldo = valor

c = ContaBancaria("Carlos", 100.0)
c.saldo += 50.0
print(f"Saldo de {c.titular}: R$ {c.saldo:.2f}")

🔍 Nível 2: Prática

Problema 05.2 — Métodos de Classe (@classmethod) e Métodos Estáticos (@staticmethod)

Contexto: Métodos de Classe (@classmethod) e Métodos Estáticos (@staticmethod) no contexto de POO em Python: Classes, Encapsulamento, Métodos e @property.

Requisitos de Execução:

  1. Criar factory method Conta.de_string('Carlos;500.0') e método estático utilitário de validação de CPF.

Resultado Esperado

Métodos de classe e métodos utilitários invocados com elegância.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_2_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - POO em Python: Classes, Encapsulamento, Métodos e @property
🔑 Gabarito de Código & Solução Comentada
class Usuario:
    def __init__(self, nome: str, email: str) -> None:
        self.nome = nome
        self.email = email

    @classmethod
    def de_csv(cls, linha: str) -> "Usuario":
        nome, email = linha.split(";")
        return cls(nome.strip(), email.strip())

u = Usuario.de_csv("Carlos Silva;carlos@empresa.com")
print(f"Usuario criado: {u.nome} ({u.email})")

⚡ Nível 3: Integração

Problema 05.3 — Dunder Methods Essenciais (repr, str, eq, hash)

Contexto: Dunder Methods Essenciais (repr, str, eq, hash) no contexto de POO em Python: Classes, Encapsulamento, Métodos e @property.

Requisitos de Execução:

  1. Implementar representação para desenvolvedores e comparação de igualdade por valor.

Resultado Esperado

Objetos comparados por valor e formatados legivelmente no console.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_3_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - POO em Python: Classes, Encapsulamento, Métodos e @property
🔑 Gabarito de Código & Solução Comentada
class Ponto2D:
    def __init__(self, x: int, y: int) -> None:
        self.x = x
        self.y = y

    def __repr__(self) -> str:
        return f"Ponto2D(x={self.x}, y={self.y})"

    def __eq__(self, outro: object) -> bool:
        if not isinstance(outro, Ponto2D):
            return False
        return self.x == outro.x and self.y == outro.y

p1 = Ponto2D(10, 20)
p2 = Ponto2D(10, 20)
print(f"Representacao: {p1} | Iguais: {p1 == p2}")

🏆 Nível 4: Desafio Corporativo

Problema 05.4 — Otimização de Memória com slots

Contexto: Otimização de Memória com slots no contexto de POO em Python: Classes, Encapsulamento, Métodos e @property.

Requisitos de Execução:

  1. Declarar __slots__ = ('x', 'y') eliminando o overhead do dicionário __dict__ por instância.

Resultado Esperado

Milhões de instâncias alocadas com redução drástica de pegada de memória RAM.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_4_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - POO em Python: Classes, Encapsulamento, Métodos e @property
🔑 Gabarito de Código & Solução Comentada
class RegistroOtimizado:
    __slots__ = ("id", "valor")
    def __init__(self, id: int, valor: float) -> None:
        self.id = id
        self.valor = valor

r = RegistroOtimizado(1, 99.9)
print(f"Registro com slots: #{r.id} -> R$ {r.valor}")

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