Как в питоне реализуется инверсия зависимостей?
Обычно в качестве объяснения говорят, что надо реализовывать абстрактные классы - от них наследоваться, а в самом объекте принимать те типы, которые реализуют этот интерфейс, что-то вроде такого:
# Абстрактный класс для работы с базой данных
class Database(ABC):
@abstractmethod
def connect(self):
pass
@abstractmethod
def execute(self, query):
pass
# Класс, который зависит от абстракции (Database)
class UserManager:
def __init__(self, database: Database):
self.db = database
def get_users(self):
query = "SELECT * FROM users"
return self.db.execute(query)
Но ведь в Python типизация только на уровне соглашения, поэтому нам ничего не помешает передать в качестве аргумента database
в UserManager
то, что не реализует интерфейс Database
, тогда в чем состоит зависимость?
Источник: Stack Overflow на русском