Реализация 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
, можно считать это интерфейсом, да и нет похоже в Питоне другого способа сделать интерфейс - интерфейс как концепция "контракта" описывает сигнатуры методов, которые вы должны реализовать в классе-наследнике, он не ограничивает вас в создании каких-то других дополнительных методов в классе-наследнике
- чтобы искомое вами ограничение сработало, вы должны были получить переменную типа не класса-наследника, как у вас, а именно интерфейса и тогда ограничения должны были бы сработать, но это в языке с интерфейсами, а фактически в Питоне, повторюсь, видимо нет интерфейсов, есть только абстрактные классы, поэтому вы не можете добиться искомого поведения - переменную типа абстрактный класс вы не сможете для этого использовать, поскольку у абстрактного класса нет реализаций методов
Вероятно, можно добиться такого поведения с помощью метаклассов, запретив каким-то образом наследникам абстрактного класса реализовывать новые методы. Но над конкретикой нужно подумать, кажется, простого готового метода для этой концепции нет.