Python中条件类继承定义

4 投票
1 回答
889 浏览
提问于 2025-04-18 08:42

我有一个基于Linux的Python应用程序,它使用了pygtkgtk这两个库。这个程序可以在图形界面模式和命令行模式下运行。在图形界面模式下,创建主应用窗口的类定义是:

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

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

我想要做的是,如果这个应用程序能够成功导入gtkpygtk,那么类ToolWindow就应该同时继承common.Singletongtk.Window这两个类;如果不能导入这两个库,它就只继承common.Singleton这个类。

那么,最好的做法是什么呢?

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__()方法——有很多种方法可以解决这个问题)。

撰写回答