使用儿童构造函数的多态超类中的重写方法

时间:2019-02-09 23:18:12

标签: python python-3.x oop

我什至不确定我是否用正确的术语提出问题,所以如果我遗漏了问题,请纠正我。

我希望有一个通用类用于处理所有子类用例,并根据所使用的子类来实现方法。我将在此处使用的示例很容易理解我正在使用的确切实现类型:

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,则可以看到想要将方法集引入共享许多常用方法的超类的情况和属性。

不确定在这里是否缺少明显的内容。 TIA。

0 个答案:

没有答案