“Introspection” 是什么意思,它与 GObject Introspection 有何关系?

“Introspection” 是什么意思,它与 GObject Introspection 有何关系?

自省到底是什么意思?它对程序员有什么用?有人能用通俗易懂的语言解释一下吗?

答案1

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

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

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

>>> instance = MyObject()

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

>>> instance.newvariable = "Kittens"

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

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


现在介绍 GObjects 和基于 GObject 的库。它们使用 C 语言编写,在 C 语言中,您不会得到所有这些可爱的、无意义的托管代码,而是获得性能。这意味着没有内置自省,这意味着维护外部绑定更加困难。

绑定是不同语言之间的 API,允许它们协同工作。为了实现这一点,您需要一个通用 API,在本例中,该 API 是 GObject。但要实现这一点,调用者绑定必须知道它可以使用什么。在 GObject Introspection 出现之前,这必须硬编码到绑定中,这意味着要维护每组绑定的手写列表。

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

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

相关内容