Você foi contratada para desenvolver um sistema de pagamento que aceita diferentes formas de pagamento: cartão de crédito, boleto bancário e PIX.
a. Crie uma classe abstrata chamada Pagamento com:
a. Um atributo valor (float)
b. Um método abstrato processar_pagamento()
b. Crie três classes que herdam de Pagamento:
a. CartaoCredito: recebe também numero_cartao e nome_titular
b. Boleto: recebe também codigo_barras
c. Pix: recebe também chave_pix
c. Cada classe deve implementar o método processar_pagamento() com uma mensagem personalizada, como:
a. “Processando pagamento de R$100.00 via cartão de crédito para João.”
b. “Pagamento de
100.00$ via boleto com código 123456789 .”
c. “Pagamento de R$100.00 via PIX usando chave joao@email.com.”
d. No programa principal (main), crie uma lista com instâncias de cada tipo de pagamento e use um laço para chamar processar_pagamento() em cada uma.
a. Crie uma classe abstrata chamada Pagamento com:
a. Um atributo valor (float)
b. Um método abstrato processar_pagamento()
b. Crie três classes que herdam de Pagamento:
a. CartaoCredito: recebe também numero_cartao e nome_titular
b. Boleto: recebe também codigo_barras
c. Pix: recebe também chave_pix
c. Cada classe deve implementar o método processar_pagamento() com uma mensagem personalizada, como:
a. “Processando pagamento de R$100.00 via cartão de crédito para João.”
b. “Pagamento de
c. “Pagamento de R$100.00 via PIX usando chave joao@email.com.”
d. No programa principal (main), crie uma lista com instâncias de cada tipo de pagamento e use um laço para chamar processar_pagamento() em cada uma.
Passo 1
O enunciado pede que eu implemente um sistema de pagamentos com as seguintes especificações: \n
- Criar uma classe abstrata chamada
com um atributo (tipo ) e um método abstrato . \n - Criar três classes que herdam de
: \n -
: além de , recebe e . \n -
: além de , recebe . \n -
: além de , recebe . \n
-
- Cada classe deve implementar
exibindo uma mensagem personalizada, por exemplo: \n - “Processando pagamento de R$100.00 via cartão de crédito para João.” \n
- “Pagamento de R$100.00 via boleto com código 123456789.” \n
- “Pagamento de R$100.00 via PIX usando chave joao@email.com.” \n
- No programa principal, criar uma lista com instâncias de cada tipo e iterar chamando
em cada uma.
As informações relevantes que eu tenho: \n
- O atributo comum entre os tipos é
(um número real). \n - Há diferenciação por atributos extras conforme o tipo de pagamento. \n
- O comportamento obrigatório é implementar o método
com mensagens diferentes. \n - Resultado esperado: ao rodar o programa, veremos as mensagens de processamento para cada instância.
Passo 2
Breve explicação didática (o que é preciso saber antes de codificar): \n
- Classe abstrata: é uma classe que serve como “modelo” e não deve ser instanciada diretamente. Em Python usamos o módulo
e fazemos a classe herdar de . Métodos marcados com o decorator obrigam as classes filhas a implementá-los. \n - Por que usar? Porque todos os pagamentos têm
e um , mas a implementação varia. Colocar isso numa classe abstrata força consistência. \n
- Por que usar? Porque todos os pagamentos têm
- Herança: classes-filhas reutilizam atributos e métodos da classe-pai e podem sobrescrever (override) métodos para comportamento específico. \n
- Formatar número para moeda: ao exibir
queremos mostrar com duas casas decimais. Em Python usamos formatação como para obter sempre duas casas decimais (por ex.: vira “100.00” no padrão Python). \n
Exemplo simples em palavras: se eu tenho, com será mostrado “100.00”.
Passo 3
Vou mostrar a estrutura da classe abstrata
e explicar linha a linha (exemplo em Python): \n
Código (explicado depois):\n
Código (explicado depois):\n
from abc import ABC, abstractmethod
class Pagamento(ABC):
def __init__(self, valor: float):
# armazeno o valor como float para garantir operações numéricas corretas
self.valor = float(valor)
@abstractmethod
def processar_pagamento(self):
pass
Explicação passo a passo: \n
from abc import ABC, abstractmethod: importa ferramentas para criar classes abstratas. \nclass Pagamento(ABC):: define a classe abstrata que não será instanciada diretamente. \ndef __init__(self, valor: float):: construtor que recebevalor. Anote quevaloré o atributo comum. Convertemos comfloat(valor)para ter garantia de tipo. \n@abstractmethodedef processar_pagamento(self):: marca que qualquer subclasse deve implementar esse método. Sem isso, a subclasse também seria abstrata e não poderia ser instanciada.
Passo 4
Agora criamos a classe
e explico o que cada parte faz: \n
Código (explicado depois):\n
Código (explicado depois):\n
class CartaoCredito(Pagamento):
def __init__(self, valor: float, numero_cartao: str, nome_titular: str):
super().__init__(valor)
self.numero_cartao = numero_cartao
self.nome_titular = nome_titular
def processar_pagamento(self):
print(f"Processando pagamento de R${self.valor:.2f} via cartão de crédito para {self.nome_titular}.")
Explicação: \n
class CartaoCredito(Pagamento):declara que herda dePagamento. \n- No construtor,
super().__init__(valor)chama o construtor da classe-pai para definirself.valor. Isso evita repetir código. \n - Armazenamos
numero_cartaoenome_titularcomo atributos específicos desse tipo. \n processar_pagamentoé a implementação obrigatória do método abstrato. A mensagem usaf-stringpara inserir o valor formatado com duas casas decimais e o nome do titular.
Passo 5
Agora a classe
(código e explicação): \n
Código:\n
Código:\n
class Boleto(Pagamento):
def __init__(self, valor: float, codigo_barras: str):
super().__init__(valor)
self.codigo_barras = codigo_barras
def processar_pagamento(self):
print(f"Pagamento de R${self.valor:.2f} via boleto com código {self.codigo_barras}.")
Explicação: \n
- A lógica é a mesma: herda
valordo pai e adicionacodigo_barras. \n - A mensagem insere
self.codigo_barraspara mostrar qual boleto está sendo processado.
Passo 6
Agora a classe
(código e explicação): \n
Código:\n
Código:\n
class Pix(Pagamento):
def __init__(self, valor: float, chave_pix: str):
super().__init__(valor)
self.chave_pix = chave_pix
def processar_pagamento(self):
print(f"Pagamento de R${self.valor:.2f} via PIX usando chave {self.chave_pix}.")
Explicação: \n
- Igual aos anteriores: guarda
chave_pixe mostra na mensagem ao processar.
Passo 7
Agora monto o programa principal (
), crio instâncias e itero sobre elas. Vou explicar por que fazer assim: \n
- Coloco cada instância numa lista porque isso permite tratar diferentes tipos de pagamento de forma uniforme (polimorfismo): ao chamar
processar_pagamento()em cada objeto, a implementação correta de cada classe será executada. \n
Código completo do programa (juntando tudo):\n
from abc import ABC, abstractmethod
class Pagamento(ABC):
def __init__(self, valor: float):
self.valor = float(valor)
@abstractmethod
def processar_pagamento(self):
pass
class CartaoCredito(Pagamento):
def __init__(self, valor: float, numero_cartao: str, nome_titular: str):
super().__init__(valor)
self.numero_cartao = numero_cartao
self.nome_titular = nome_titular
def processar_pagamento(self):
print(f"Processando pagamento de R${self.valor:.2f} via cartão de crédito para {self.nome_titular}.")
class Boleto(Pagamento):
def __init__(self, valor: float, codigo_barras: str):
super().__init__(valor)
self.codigo_barras = codigo_barras
def processar_pagamento(self):
print(f"Pagamento de R${self.valor:.2f} via boleto com código {self.codigo_barras}.")
class Pix(Pagamento):
def __init__(self, valor: float, chave_pix: str):
super().__init__(valor)
self.chave_pix = chave_pix
def processar_pagamento(self):
print(f"Pagamento de R${self.valor:.2f} via PIX usando chave {self.chave_pix}.")
if __name__ == "__main__":
# crio instâncias de exemplo
p1 = CartaoCredito(100.00, "1111-2222-3333-4444", "João")
p2 = Boleto(100.00, "123456789")
p3 = Pix(100.00, "joao@email.com")
pagamentos = [p1, p2, p3]
for p in pagamentos:
p.processar_pagamento()
Comentários práticos: \n
if __name__ == "__main__":permite que o código seja importado como módulo sem executar o bloco de teste automaticamente. \n- Os valores
100.00no exemplo são apenas ilustrativos; em um sistema real viriam de input do usuário ou de outra parte do sistema. \n - Ao executar este script em Python, cada chamada a
processar_pagamento()exibirá a mensagem correspondente ao tipo do objeto.
Passo 8
Dicas para a hora da prova (resumo prático e rápido): \n
- Lembre-se: criar a classe abstrata com
ABCe@abstractmethodquando você quer garantir assinatura comum e obrigar implementação nas filhas. \n - Use
super().__init__(...)para reaproveitar inicialização do pai. \n - Use
f"{valor:.2f}"para formatar números com duas casas decimais. \n - Para testar rapidamente, crie uma lista com instâncias diferentes e faça um
forchamando o método comum — é o exemplo mais simples de polimorfismo.
Resposta
Processando pagamento de R$100.00 via cartão de crédito para João.
Pagamento de R$100.00 via boleto com código 123456789.
Pagamento de R$100.00 via PIX usando chave joao@email.com.
Pagamento de R$100.00 via boleto com código 123456789.
Pagamento de R$100.00 via PIX usando chave joao@email.com.