需要使用替代签名实例化时如何扩展 PyGobject class?

How do I extend PyGobject class when needing to instantiate with alternative signature?

我在项目中使用 Gtk.TextView,我需要更改实例化对象的方式,以便我可以在 TextView 中包含自定义 TextBuffer。

目前我的相关代码是:

# Relevant code only
class EditBox(Gtk.TextView):

    __gsignals__ = {
        # some signals
    }

    def __init__(self):
        super().__init__()

这个 class 到目前为止实例化和工作完美。我想要进行的更改需要使用 new_with_buffer 签名,如 here 所述。简单地向 super 语句传入缓冲区并不能解决问题,instantiating/calling a super.add_with_buffer() 也会导致错误。

我需要能够扩展我的 EditBox,以便我可以使用父级中的 new_with_buffer 方法实例化它,或者能够以正确实例化的方式超级化这是。进行此更改后,我不需要能够在没有缓冲区的情况下进行实例化。

我可以使用 new_with_new 方法实例化 TextView 本身,并将其传递到缓冲区中,但我似乎无法弄清楚如何以这种方式扩展 TextView class我可以将缓冲区传递到我自己的扩展 class 并将其传递给父级。

这是怎么做到的?

kwargs 传递给超类构造函数并将 buffer 属性 作为参数传递给构造函数与使用 new_with_buffer 的效果相同。 new_with_buffer 可能仅作为 C 程序员的便利函数存在。

使用基于 PyGObject 的绑定,you can pass properties 到将用于初始化它们的构造函数。

class EditBox(Gtk.TextView):
    …
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # do extra stuff

my_edit_box = EditBox(buffer=my_shared_buffer)