Как правильно выбрать реализацию дочернего класса условно? - PullRequest
1 голос
/ 07 мая 2020

У меня есть база данных с тремя разными таблицами. У меня есть интерфейс абстрактного родительского класса, а также три дочерних класса, которые являются интерфейсами для каждой отдельной таблицы. Пока проблем нет.

Мне нужно использовать каждый из этих интерфейсов в разных ios сценариях в зависимости от того, к какой таблице мне нужно получить доступ. Как правильно сделать это в Python?

Моя первая мысль - это простая условная проверка if else:

for name in names:
  if name == 'tbl1':
    cls = Table1Interface()
  elif name == 'tbl2':
    cls = Table2Interface()
  elif name == 'tbl3':
    cls = Table3Interface()

cls.get_value_from_table()

Это не кажется лучшим решением, хотя, поскольку если мне нужно добавить таблицу и интерфейс, мне нужно зайти сюда и также изменить этот код. Я пытаюсь следовать принципу инкапсуляции изменений, но не знаю, как это применить.

1 Ответ

0 голосов
/ 07 мая 2020

Я бы определил словарь 'сопоставления' конфигурации, где значение - это функция интерфейса, а ключ - это имя. Что-то вроде:

cls = {
    'tbl1': Table1Interface,
    'tbl2': Table2Interface,
    'tbl3': Table3Interface,
}

cls[name].get_value_from_table()

Изменение доступных интерфейсов - это просто вопрос обновления этого единственного словаря.

Если вы можете определить метод интерфейса из name (например, name - это Table1Interface, а все классы являются атрибутами my_class), тогда вы можете использовать getattr для доступа к нему:

getattr(my_class, name).get_value_from_table()

Или, если это метод «верхнего уровня», используйте locals:

locals()[name].get_value_from_table()
...