我主要使用PHP进行编程,现在正试图转向Python。我熟练掌握PHP,并且从未需要使用内省/反射等功能。那么代码内省有什么好处,在什么情况下会变得无可替代呢?
以下是我认为代码内省有用的唯一方式:
从我在“深入Python”的例子中看到的,内省基本上意味着您可以列出对象的所有函数和属性。对我来说,内省就像一个对象的“用户手册”。它允许您从python shell查看对象及其功能。
我只是不知道为什么或在什么情况下,您会对任意对象进行内省,并做出有用的事情。
我主要使用PHP进行编程,现在正试图转向Python。我熟练掌握PHP,并且从未需要使用内省/反射等功能。那么代码内省有什么好处,在什么情况下会变得无可替代呢?
以下是我认为代码内省有用的唯一方式:
从我在“深入Python”的例子中看到的,内省基本上意味着您可以列出对象的所有函数和属性。对我来说,内省就像一个对象的“用户手册”。它允许您从python shell查看对象及其功能。
我只是不知道为什么或在什么情况下,您会对任意对象进行内省,并做出有用的事情。
假设你有一个自定义对象,你想知道该对象是否具有某些属性或某个方法,那么可以使用内省函数(例如hasattr
)来查找。
就像《Dive into Python》一书中已经说明的那样,如果您正在构建带有自动完成功能的GUI编辑器,您想要在运行时获取可调用的对象的公共方法,则可以使用内省方法,例如通过dir
获得每个方法的getattr
,并检查它是否是可调用的,然后将其显示在您的自动完成列表中。
我在实际项目中使用introspection的一个例子:
我们有一个名为TaskService的管理后台任务的服务。每个任务实际上都是实现了给定接口的Start()和Stop()方法的类。我们有一个配置文件,将每个任务与其类匹配。所以运行TaskService时,它只是浏览配置文件,并对于每个任务获取类的名称,并通过reflection(introspection是reflection的一个子部分)在运行时实例化。
另一个introspection可能有用的示例是在编程语言中使用注释。注释用于向其他第三方程序(如ORMs)提供关于您的类的元信息,例如您可以使用注释来告诉某个类是否为实体类(这在Java中是正确的,但Python不支持),或关于某些属性的关联类型等。
代码补全是introspection有用性的另一个例子。
顺便说一下,正如你提到的,introspection在程序文档工具方面非常有帮助。
Person
的类,则不必编写访问器方法,例如name
或email
。只要与相同名称的列(在本例中为name
和email
)存在于关联表中(在本例中为people
),Active Record就会在运行时为这些同名属性定义访问器方法。
write()
方法,Python将很乐意让你在任何你想写文件的地方使用它——无论它是否派生自file
类。(这与其他一些语言非常不同!)因此,如果你要写入一个文件,你可以先试试看是否会出现异常,或者你可以先使用hasattr()
检查它是否有一个write()
方法。通常的Python习惯用法实际上是先尝试并捕获异常,但有些情况下“三思而后行”也很有用。 - kindall