Я даже не уверен, что поставил проблему с правильной номенклатурой, поэтому, пожалуйста, исправьте меня, если я неверно сформулировал вопрос.
Я хочу иметь универсальный класс, который используется для обработки всех подклассовслучаи, реализующие методы в зависимости от того, какой подкласс используется.Пример, который я буду использовать здесь, достаточно прост для понимания с точным типом реализации, которую я использую:
class display():
def __init__(self, **config):
self.type = config['type']
if self.type == 'type_a':
# Call constructor to type_a?
elif self.type == 'type_b':
# Call constructor to type_b?
def a_multi_use_function(self, **kwargs):
# Do something the same for all display types
print('hello! You have initialized a display of type {}'.format(self.type))
class type_a():
__init__(self, **config):
# implementation specific hardware configuration here
# Load drivers as necessary, override base class methods
# for device configuration
print('Hello! You are initializing device type_a, with config {}'.format(config)
def print_to_display(self, text):
# print to display the way you would on display a
print("printing on display a")
# Appropriate mechanics here.
class type_b():
__init__(self, **config):
# implementation specific hardware configuration here
# Load drivers as necessary, override base class methods
# for device configuration
print('Hello! You are initializing device type_b, with config {}'.format(config)
def print_to_display(self, text):
# print to display the way you would on display b
print("printing on display b")
# Appropriate mechanics here.
Использование:
config = {'type':'type_a'}
my_display = display(**config)
my_display.print_to_display('Hello world')
Это должно напечатать сообщение print_to_display, в зависимости откакой тип передается.
Теперь я знаю, что мог бы сделать так, чтобы type_a и type_b были дочерними, но я бы хотел, чтобы вызывающий код не зависел от того, какие драйверы / дисплеи доступны, чтобы я мог, например,изменить файл конфигурации, добавить драйверы, но всегда создавать экземпляры, используя display () вместо type_a () или type_b ().Также кажется, что в зависимости от других параметров конфигурации я бы хотел переопределить набор методов.Так что, если устройство отображения имеет тип type_a, я бы для этого использовал драйверы оборудования.Но если для другого оборудования требуются другие драйверы, я мог бы создать экземпляр для переопределения или добавления других методов.
Еще один способ сделать это - добавить короткую вспомогательную функцию, например:
def get_display(**config):
if config['type'] == 'type_a':
return type_a(**config)
elif config['type'] == 'type_b':
return type_b(**config)
Используя типичное наследование:
class type_b(display):
...
class type_a(display):
...
Но, опять же, как я уже упоминал выше, если у меня есть устройство с потенциально отображаемым type_a, но базовым устройством является type_1, я вижу случай, когда нужно использовать наборы методовв суперкласс, который имеет много общих методов и свойств.
Не уверен, что я упустил что-то очевидное здесь.ТИА.