0

我有一个顶级类和扩展顶级类的类,但是子类的几乎所有方法都来自顶级类(使用继承,没有重新实现),所以我没有子类中的方法,我怎么能为每个子类使用 dbus 导出它们(每个子类的名称作为 dbus 路径的一部分)?

我将显示一个示例代码以进行澄清,我的类结构是:

Window (main class)
  |--WindowOne (child class)
  |--WindowTwo
  |--WindowThree

我的 dbus 接口是com.example.MyInterface,我想使用 : 访问每个子类com.example.MyInterface.WindowOne,并且对于每个子类,我想访问方法,包括从主类继承的方法,例如com.example.MyInterface.WindowOne.showcom.example.MyInterface.WindowOne.destroy

在这段代码中,我用'Window'类扩展了子类'WindowOne','Window'中的方法show()destroy()'WindowOne'没有重新实现,但是在这段代码中我把方法放在了show()解释问题的地方,我让代码工作的方式是这样的,我在子类中重新声明了该方法show(),但这似乎很糟糕。

最大的问题可能是:有一些方法可以使用装饰器:@dbus.service.method('com.example.MyInterface.WindowOne')对于类(在这种情况下是子类)?

测试源代码:

# interface imports
from gi.repository import Gtk

# dbus imports  
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

# Main window class
class Window(dbus.service.Object):
    def __init__(self, gladeFilePath, name):
        # ... inicialization
        self.name = name
        self.busName = dbus.service.BusName('com.example.MyInterface.', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, self.busName, '/com/example/MyInterface/' + self.name)

    def show(self):
        self.window.show_all()

    def destroy(self):
        Gtk.main_quit()


# Child window class
class WindowOne(Window):
    def __init__(self, gladeFilePath):
        Window.__init__(self, gladeFilePath, "WindowOne")

    @dbus.service.method('com.example.MyInterface.WindowOne')
    def show(self):
        self.window.show_all()


if __name__ == "__main__":
    DBusGMainLoop(set_as_default=True)

    gladeFilePath = "/etc/interface.glade"
    windowOne = WindowOne(gladeFilePath)

    Gtk.main()
4

1 回答 1

0

经过一些实验,我意识到了一些我以前在文档中没有找到的重要内容:导出方法的路径不需要与导出对象的路径相同!澄清:如果方法没有在子类(WindowOne)中重新实现,我不需要在子类中使用导出它@dbus.service.method('com.example.MyInterface.WindowOne'),例如,我只需在主类中导出方法(Window)使用:@dbus.service.method('com.example.MyInterface.Window')

所以我只需要在导出顶级类的方法时使用一个固定的路径Window,见下面的固定代码。

# interface imports
from gi.repository import Gtk

# dbus imports  
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

# Main window class
class Window(dbus.service.Object):
    def __init__(self, gladeFilePath, name):
        # ... inicialization
        self.name = name
        self.busName = dbus.service.BusName('com.example.MyInterface.', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, self.busName, '/com/example/MyInterface/' + self.name)

    @dbus.service.method('com.example.MyInterface.Window')
    def show(self):
        self.window.show_all()

    @dbus.service.method('com.example.MyInterface.Window')
    def destroy(self):
        Gtk.main_quit()

    @dbus.service.method('com.example.MyInterface.Window')
    def update(self, data):
        # top class 'update' method


# Child window class
class WindowOne(Window):
    def __init__(self, gladeFilePath):
        Window.__init__(self, gladeFilePath, "WindowOne")

    @dbus.service.method('com.example.MyInterface.WindowOne')
    def update(self, data):
        # reimplementation of top class 'update' method


if __name__ == "__main__":
    DBusGMainLoop(set_as_default=True)

    gladeFilePath = "/etc/interface.glade"
    windowOne = WindowOne(gladeFilePath)

    Gtk.main()

在调用总线方法的代码中,我只是使用如下:

bus = dbus.SessionBus()
dbusWindowOne = bus.get_object('com.example.MyInterface', '/com/example/MyInterface/WindowOne')
showWindowOne = dbusWindowOne.get_dbus_method('show', 'com.example.MyInterface.Window')
updateWindowOne = dbusWindowOne.get_dbus_method('update', 'com.example.MyInterface.WindowOne')

该方法show在顶级类中调用,但在作为子类Window的对象中执行。WindowOne

并且该方法update在子类中被调用WindowOne,因为它正在重新实现顶级类方法。

于 2012-12-28T13:05:20.587 回答