Especialização em Sistemas com Python & POO com Type Hints • Capítulo 09


🗺️ Mapa Conceitual do Tópico

classDiagram
    class MeioPagamento {
        <<abstract>>
        #Decimal valor
        +processar_transacao()* tuple
    }

    class PagamentoPix {
        +chave_pix: str
        +processar_transacao() tuple
    }

    class PagamentoCartao {
        +numero_cartao: str
        +processar_transacao() tuple
    }

    MeioPagamento <|-- PagamentoPix : Herança Nominal (IS-A)
    MeioPagamento <|-- PagamentoCartao : Herança Nominal (IS-A)

🧬 1. Herança e Classes Abstratas (abc.ABC)

  • Classes Abstratas: Herdam de abc.ABC e marcam métodos obrigatórios com @abstractmethod, impedindo instanciação direta de contratos incompletos.
  • Polimorfismo Nominal: Permite tratar instâncias de diferentes subclasses de forma uniforme através da interface da superclasse.
  • Method Resolution Order (MRO): A ordem de resolução de herança é acessível via Classe.mro(), governada pelo algoritmo C3 Linearization.

💻 Exemplo Prático e Tipado

"""
exemplo_09_heranca_e_polimorfismo.py - Gateway de Pagamentos Polimórfico
"""

from abc import ABC, abstractmethod
from decimal import Decimal


class GatewayPagamento(ABC):
    def __init__(self, taxa_percentual: Decimal) -> None:
        self.taxa = taxa_percentual

    @abstractmethod
    def autorizar(self, valor: Decimal) -> tuple[bool, Decimal]:
        pass


class GatewayPix(GatewayPagamento):
    def autorizar(self, valor: Decimal) -> tuple[bool, Decimal]:
        tarifa = valor * self.taxa
        return True, valor - tarifa


class GatewayCartao(GatewayPagamento):
    def autorizar(self, valor: Decimal) -> tuple[bool, Decimal]:
        tarifa = (valor * self.taxa) + Decimal("0.50")
        return True, valor - tarifa


if __name__ == "__main__":
    gateways: list[GatewayPagamento] = [
        GatewayPix(taxa_percentual=Decimal("0.009")), # 0.9%
        GatewayCartao(taxa_percentual=Decimal("0.025")), # 2.5%
    ]

    valor_venda = Decimal("200.00")
    for g in gateways:
        ok, liquido = g.autorizar(valor_venda)
        print(f"[{g.__class__.__name__}] Venda: R$ {valor_venda:.2f} -> Líquido: R$ {liquido:.2f}")

🔗 Recursos Pedagógicos do Capítulo 09

Recurso Didático Finalidade Link de Acesso
📊 Slides de Aula Apresentação visual interativa com Dark Mode e suporte a teclado Ver Slides
🧠 Quiz Formativo Teste interativo de fixação com feedback imediato por alternativa Fazer Quiz
💻 Exemplos de Código Demonstrações funcionais com Type Hints e saída no console Ver Exemplos
🧩 Exercícios em 4 Níveis Lista progressiva de fixação com gabarito em bloco colapsável Resolver Exercícios

✨ Capítulo Anterior 📚 Sumário de Tópicos 📜 Próximo Capítulo