Python中的有条件的类继承定义

4

我有一个基于linux的python应用程序,使用了pygtkgtk。它具有UI执行和命令行模式执行选项。在UI模式下,为了创建主应用程序窗口,类定义如下:

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

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

我想要实现的是,如果应用程序能够导入gtkpygtk,那么ToolWindow类应该同时继承common.Singletongtk.Window类,否则它只能继承common.Singleton类。
最好的方法是什么?

你可以使用type()内置函数来查看元编程:它为您提供了一种以编程方式定义类的方法。 - Unda
1个回答

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

   ...

这只是一个初步的草图,显然有许多改进可以做,但它应该能帮助你入门。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接