自省有什么用?

16 投票
4 回答
6867 浏览
提问于 2025-04-16 12:11

我主要在用PHP编程,现在想转到Python。虽然我对PHP很熟悉,但我从来没有需要用到“自省”这种功能。自省有什么用?在什么情况下它是必不可少的呢?

我觉得自省的用处就只有一个:根据我在《Dive into Python》看到的例子,自省基本上就是你可以列出一个对象的所有函数和属性。对我来说,自省就像是对象的“用户手册”。它让你可以从Python的命令行界面查看对象及其功能。

我就是不明白,为什么或者在什么情况下你会拿一个随便的对象去自省,然后做一些有用的事情。

4 个回答

2

我写了一个文档验证器,它可以对PDF文件进行测试,以检查其中的各种问题。这些测试是一些特殊类的方法,这些类代表了版本控制的分支、产品、手册以及各种类型的任意分组。验证器引擎利用反射技术来找到这些特殊类,创建它们的实例,并运行它们的方法。

我本可以写一个验证器,让你必须写很多重复的代码来实例化每个类,调用每个方法等等。但这样做会导致代码重复,而且在维护时容易出问题(比如在添加或删除测试时,可能会忘记更新两个地方)。通过利用你想对所有特殊类执行相同操作的事实,计算机可以为你处理这些重复的工作,而且不会出错。这样,你只需要在一个地方声明文档的结构。

4

这里有一个我在真实项目中使用自省的例子:

我们有一个服务,负责管理后台任务,叫做 TaskService。每个任务其实都是一个类,这个类实现了一个接口中的 Start()Stop() 方法。我们有一个配置文件,在里面把每个任务和它对应的类进行了匹配。所以当运行 TaskService 时,它会浏览这个配置文件,对于每个任务,它会取出类的名字,并通过 反射(自省是反射的一部分)在运行时实例化这个类。

另一个自省有用的例子是编程语言中的注解。注解用来给其他第三方程序(比如对象关系映射工具)提供关于你类的元信息。例如,你可以用注解来告诉程序某个类是否是实体类(在Java中是这样,我对Python不太了解,抱歉),或者某些属性的关联类型等等。

代码补全也是自省有用的一个例子。

顺便提一下,正如你提到的,自省对编程文档工具的帮助也很大。

14

假设你有一个自定义的对象,你想知道这个对象是否有某些属性或者某个方法,这时候可以用像 hasattr 这样的函数来检查。

就像《DiveintoPython》这本书里说的,假设你正在制作一个带有自动补全功能的图形用户界面编辑器,你想获取在运行时可以调用的对象的公共方法,这时可以先用 dir 来列出所有方法,然后对每个方法使用 getattr 来检查它是否可以被调用,最后把这些方法显示在你的自动补全列表里。

撰写回答