GObject.Object

Compare to other types, GObject.Object has the best integration between the GObject and Python type system.

  1. It is possible to subclass a GObject.Object. Subclassing creates a new GObject.GType which is connected to the new Python type. This means you can use it with API which takes GObject.GType.
  2. The Python wrapper instance for a GObject.Object is always the same. For the same C instance you will always get the same Python instance.

In addition GObject.Object has support for signals and properties

Examples

Subclassing:

>>> from gi.repository import GObject
>>> class A(GObject.Object):
...     pass
...
>>> A()
<__main__.A object at 0x7f9113fc3280 (__main__+A at 0x559d9861acc0)>
>>> A.__gtype__
<GType __main__+A (94135355573712)>
>>> A.__gtype__.name
'__main__+A'
>>>

In case you want to specify the GType name we have to provide a __gtype_name__:

>>> from gi.repository import GObject
>>> class B(GObject.Object):
...     __gtype_name__ = "MyName"
...
>>> B.__gtype__
<GType MyName (94830143629776)>
>>>

GObject.Object only supports single inheritance, this means you can only subclass one GObject.Object, but multiple Python classes:

>>> from gi.repository import GObject
>>> class MixinA(object):
...     pass
...
>>> class MixinB(object):
...     pass
...
>>> class MyClass(GObject.Object, MixinA, MixinB):
...     pass
...
>>> instance = MyClass()

Here we can see how we create a Gio.ListStore for our new subclass and that we get back the same Python instance we put into it:

>>> from gi.repository import GObject, Gio
>>> class A(GObject.Object):
...     pass
...
>>> store = Gio.ListStore.new(A)
>>> instance = A()
>>> store.append(instance)
>>> store.get_item(0) is instance
True
>>>