Python связывает реализацию с абстрактным методом только по точному имени. refound — новый,
никому не нужный метод, а refund остаётся абстрактным, и класс нельзя создать. Без ABC
такая опечатка прожила бы до первого возврата денег; абстрактный класс поймал её при создании.
Эталонное решение
from abc import ABC, abstractmethod
class PaymentGateway(ABC):
@abstractmethod
def charge(self, order_id, amount):
"""Списать деньги и вернуть id транзакции."""
@abstractmethod
def refund(self, order_id, amount):
"""Вернуть деньги покупателю."""
class InstallmentGateway(PaymentGateway):
def charge(self, order_id, amount):
return f"inst-{order_id}"
def refund(self, order_id, amount):
return f"inst-refund-{order_id}"
gateway = InstallmentGateway()
print(gateway.charge(1042, 2998), gateway.refund(1042, 2998))