python中的条件类继承定义

时间:2014-06-05 09:01:48

标签: python inheritance

我有一个基于linux的python应用程序,它使用pygtk和gtk。 它有UI执行和命令行模式执行选项。 在UI模式下,要创建主应用程序窗口,类定义是

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

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

我想要做的是,如果应用程序能够导入gtk和pygtk,那么只有 class ToolWindow应该继承common.Singleton和gtk.Window类,否则它应该只继承common.Singleton类。

最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

您可以指定一个元类,您可以在其中测试哪些模块是可导入的:

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

   ...

这只是一个原始草图,显然可以做很多改进,但它应该可以帮助你开始。

您应该知道,您应该从__init__()更改ToolWindow方法,因为它可能没有gtk模块可用(可能在元类中设置一个标志,以便稍后检查是否模块可用;或者你甚至可以根据模块是否可用从元类中重新定义__init__()方法 - 有几种方法可以解决这个问题。