Реализация Interface в python

Не могу понять как работает интерфейс. Я думал, что интерфейс - это ограничение, и что я смогу пользоваться только перечисленными методами, однако смог вызвать метод AbsoluteNull. В моей голове работает так, что я создаю экземпляр интерфейса и пользуюсь только этими методами, что были перечислены. Возможно, что я не дописал что-то или не совсем правильно понял реализацию?

import abc
from abc import ABC, abstractmethod

class IBank(ABC):
    @abstractmethod
    def WithdrawMoney(self):
        raise NotImplementedError

    @abstractmethod
    def DepositMoney(self):
        raise NotImplementedError

    @abstractmethod
    def ShowBalance(self):
        raise NotImplementedError

class Bank1(IBank):
    def __init__(self, balance):
        self.balance = balance

    def WithdrawMoney(self):
        print("Введите сумму:")
        money = int(input())
        self.balance = self.balance - money

    def DepositMoney(self):
        print("Введите сумму:",)
        money = int(input())
        self.balance = self.balance + money

    def ShowBalance(self):
        print("Ваш счёт:", self.balance)

    def AbsoluteNull(self):
        print("Ваш счёт пуст")
        self.balance = 0

class Bank2(IBank):
    def __init__(self, balance):
        self.balance = balance

    def WithdrawMoney(self):
        print("Введите сумму:")
        money = int(input())
        self.balance = self.balance - money

    def DepositMoney(self):
        print("Введите сумму:")
        money = int(input())
        self.balance = self.balance + money

    def ShowBalance(self):
        print("Ваш счёт:", self.balance)

card = Bank1(int(input()))
card.WithdrawMoney()
card.ShowBalance()
card.DepositMoney()
card.ShowBalance()
card.AbsoluteNull()

Ответы (1 шт):

Автор решения: CrazyElf

Тезисно по пунктам:

  • если не фиксироваться на Питоне, то абстрактный класс и интерфейс - это не одно и то же, хотя в вашем случае, когда все методы класса обёрнуты в @abstractmethod, можно считать это интерфейсом, да и нет похоже в Питоне другого способа сделать интерфейс
  • интерфейс как концепция "контракта" описывает сигнатуры методов, которые вы должны реализовать в классе-наследнике, он не ограничивает вас в создании каких-то других дополнительных методов в классе-наследнике
  • чтобы искомое вами ограничение сработало, вы должны были получить переменную типа не класса-наследника, как у вас, а именно интерфейса и тогда ограничения должны были бы сработать, но это в языке с интерфейсами, а фактически в Питоне, повторюсь, видимо нет интерфейсов, есть только абстрактные классы, поэтому вы не можете добиться искомого поведения - переменную типа абстрактный класс вы не сможете для этого использовать, поскольку у абстрактного класса нет реализаций методов

Вероятно, можно добиться такого поведения с помощью метаклассов, запретив каким-то образом наследникам абстрактного класса реализовывать новые методы. Но над конкретикой нужно подумать, кажется, простого готового метода для этой концепции нет.

→ Ссылка