“自省”是什么意思,它与 GObject 自省有什么关系?

Nis*_*wal 10 gtk application-development gobject

内省究竟是什么意思?它对程序员有什么用?有人可以用通俗的语言解释一下吗?

Oli*_*Oli 14

自省是一种在运行时找出对象是什么以及它包含什么的方法。在某些语言中,这比其他语言更必要。Python 是动态类型的(也就是说,对象可以在运行时获得属性和方法)使用自省来找出对象的当前状态。

这是一个非常简单的 Python 示例,您从一个类开始并添加一个新属性,然后使用自省监视对象实例上可用的属性。

>>> class MyObject:
...   variable = False

>>> instance = MyObject()

>>> dir(instance)
['__doc__', '__module__', 'variable']

>>> instance.newvariable = "Kittens"

>>> dir(instance)
['__doc__', '__module__', 'newvariable', 'variable']
Run Code Online (Sandbox Code Playgroud)

因此,在动态系统中,您可以使用 Python 之类的东西hasattr来判断一个对象是否能够执行您尝试使用它执行的操作。即使您不在运行时使用它,内省对于调试也非常有用。


现在到 GObjects 和基于 GObject 的库。它们在 C 中,在 C 中你不会得到所有这些可爱的蓬松托管代码的废话,你得到了性能。这意味着没有内置的内省,这意味着维护外部绑定更加困难。

绑定是不同语言的事物之间的 API,允许它们一起工作。为了让它工作,你需要一个通用的 API,在这种情况下,API 是 GObject。但是要使其正常工作,调用者绑定必须知道它可以使用什么。在 GObject Introspection 之前,这必须硬编码到绑定中,这意味着在每组绑定上维护一个手写列表。

GObject Introspection 本质上提供了一个扫描器,它可以搜索您正在使用的 GObject 的当前源,并为您提供 XML 绑定信息。然后由绑定处理,您最终会得到一个始终有效的 API。

我当然没有在这里涵盖所有内容,但我试图让您了解这两个主题(内省以及 GObjects 为什么需要它)。如果您想了解更多信息,Gnome 网站上有很多内容。