1

I am not even sure if I have posed the problem with correct nomenclature, so please do correct me if I have misstated the question.

I wish to have a generic class that used to handle all subclass use cases, implementing methods depending on which subclass is being used. The example I will use here is easy enough to understand with the exact type of implementation I am using:

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.

Usage:

config = {'type':'type_a'}
my_display = display(**config)
my_display.print_to_display('Hello world')

This should print the print_to_display message, depending on which type is passed.

Now, I know I could do this the way of making type_a and type_b as children, but I would like the calling code to be completely agnostic to what drivers/displays are available, so I could, for example, change a config file, add drivers, but always instantiate using display() instead of type_a() or type_b(). It also seems like, depending on other config parameters, I would want to override a set of methods. So, if a display device is of type_a, I would pull in hardware drivers for that. But if other hardware required different drivers, I could then instantiate that to override or add other methods.

Another way to do this could be just adding a short helper function like:

def get_display(**config):
    if config['type'] == 'type_a':
        return type_a(**config)
    elif config['type'] == 'type_b':
        return type_b(**config)

Using typical inheritance:

class type_b(display):
    ...
class type_a(display):
    ...

But again, as I mentioned above, if I have a device with potentially display type_a but the underlying device is type_1, I can see the case of wanting to pull in sets of methods into a superclass that shares a lot of common methods and properties.

Not sure if I'm missing something obvious here. TIA.

C Reese
  • 78
  • 9
  • [why-dict-getkey-instead-of-dictkey](https://stackoverflow.com/questions/11041405/why-dict-getkey-instead-of-dictkey) – Patrick Artner Feb 09 '19 at 23:21
  • That's interesting. Thanks. I left it out, but typically use a default set of parameters in functions that I find cleaner. Inside the method, I'd have settings = {'key':'parameter'} and then use a settings.update(config). This puts them all in one place at the beginning of functions. I store debug, verbosity, and all that stuff in there. Alternatively, I'd use handlers that require a parameter be provided. There should not, for example, be a default for display type. If you don't specify which type, you get None. – C Reese Feb 09 '19 at 23:23

0 Answers0