我一直在用PHP编程,我正在尝试切换到python。我熟悉PHP,我从来不需要像内省一样使用内省/内省。代码内省有什么用处,在什么情况下我会发现它是不可或缺的?
这是我发现它有用的唯一方法: 从我在'Dive into Python'中看到的例子中,内省基本上意味着你可以列出一个对象的所有功能和属性。对我而言,内省似乎只是作为对象的“用户手册”。它允许您从python shell查看对象及其功能。
我只是不明白为什么或在什么情况下你会采取一个任意的对象,反思它,并做一些有用的事情。
答案 0 :(得分:12)
假设您有一个自定义对象,并且您想知道该对象是否具有某些属性或具有某种特定方法,那么可以使用内省函数(如hasattr
)来查找该对象。
就像已经说明的DiveintoPython书一样,假设您正在构建具有自动完成功能的GUI编辑器,您希望获得在运行时可调用的对象的公共方法,那么您可以使用内省方法对于通过getattr
获取的方法的dir
类似callable
,并检查它是否为{{1}},然后将其显示在自动完成列表中。
答案 1 :(得分:4)
我在实际项目中使用内省的一个例子:
我们有一项服务正在管理名为TaskService
的后台任务。每个任务实际上都是作为一个实现给定接口的Start()Stop()方法的类实现的。我们有一个配置文件,我们在其中将每个任务与其类匹配。因此,当运行TaskService时,它只是浏览了配置文件,并且每个任务都获取了类的名称,并通过reflection(在运行时)将其实例化(内省是反射的子部分)。
内省可能有用的另一个例子是在编程语言中使用注释。注释用于向其他第三方程序(如ORM)提供有关类的元信息,例如,您可以使用注释来判断类是否是实体类(在Java中就是这种情况,我不知道Python抱歉),或关于某些属性的关联类型等。
代码完成是内省有用的另一个例子。
顺便说一句,正如你所提到的,内省对编写文档工具有很大的帮助。
答案 2 :(得分:2)
我写了一个文档验证程序,它运行PDF文件的测试,以检查它们的各种问题。测试是特殊类的方法,表示Subversion分支,产品,手册和各种类型的任意分组。验证器引擎使用内省来查找这些特殊类,实例化它们并运行它们的方法。
我本来可以编写验证器,这样你就必须编写样板代码来实例化每个类,调用每个方法等等。但这会重复自己并且容易出现维护问题(添加/删除时无法更新这两个地方测试,在这种情况下)。通过利用您想要对所有特殊类应用相同操作的事实,计算机基本上可以为您做样板操作,并且它不会出错。这样,您只需要在一个地方声明文档的结构。
答案 3 :(得分:1)
稍晚一点,但是使用另一个自省示例是 Active Record (将对象映射到数据库表的Ruby库)。 Active Record使用自省功能来查看类的名称,确定关联的表,并定义在从数据库架构中推断出对象属性名称之后访问对象属性的方法。它在运行时读取架构(此处正在进行元编程和自省)。因此,例如,如果您有一个类Person, you don't have to write accessor methods e.g
名称or
电子邮件. As long as columns by the same name (in this case
名称and
电子邮件) exist in the associated table (in this case
人`),则Active Record会为这些属性定义访问器方法在运行时具有相同的名称。