Python中条件类继承定义
我有一个基于Linux的Python应用程序,它使用了pygtk
和gtk
这两个库。这个程序可以在图形界面模式和命令行模式下运行。在图形界面模式下,创建主应用窗口的类定义是:
class ToolWindow(common.Singleton, gtk.Window):
def __init__(self):
gtk.Window.__init__(self,gtk.WINDOW_TOPLEVEL)
我想要做的是,如果这个应用程序能够成功导入gtk
和pygtk
,那么类ToolWindow
就应该同时继承common.Singleton
和gtk.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__()
方法——有很多种方法可以解决这个问题)。