Методы переопределения в полиморфном суперклассе с использованием детских конструкторов - PullRequest
0 голосов
/ 10 февраля 2019

Я даже не уверен, что поставил проблему с правильной номенклатурой, поэтому, пожалуйста, исправьте меня, если я неверно сформулировал вопрос.

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

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

Не уверен, что я упустил что-то очевидное здесь.ТИА.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...