我有一个基于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类。
最好的方法是什么?
答案 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__()
方法 - 有几种方法可以解决这个问题。