rohan wadnerkar
rohan wadnerkar

Reputation: 119

conditional class inheritance definition in python

I have an linux based python application, which make use of pygtk and gtk. It have both UI execution & command line mode execution option. In UI mode, to create main application window, class definition is

class ToolWindow(common.Singleton, gtk.Window):

     def __init__(self):
         gtk.Window.__init__(self,gtk.WINDOW_TOPLEVEL)

What I want to do is, if application is able to import gtk and pygtk, then only class ToolWindow should inherit both common.Singleton and gtk.Window classes, else it should only inherit common.Singleton class.

What is the best way to do it?

Upvotes: 4

Views: 900

Answers (1)

linkyndy
linkyndy

Reputation: 17900

You can specify a metaclass where you can test what modules are importable:

class Meta(type):
    def __new__(cls, name, bases, attrs):
        try:
            import gtk
            bases += (gtk.Window)
        except ImportError:
            # gtk module not available
            pass

        # Create the class with the new bases tuple
        return super(Meta, cls).__new__(cls, name, bases, attrs)


class ToolWindow(common.Singleton):
    __metaclass__ = Meta

   ...

This is just a raw sketch, obviously many improvements can be done, but it should help you get started.

You should be aware that you should change your __init__() method from ToolWindow because it may not have the gtk module available (maybe set a flag in the metaclass to later check if the module is available; or you can even redefine the __init__() method from within the metaclass based on whether the module is available or not -- there are several ways of tackling this).

Upvotes: 3

Related Questions