我需要接受一个字符串参数并在 Python 中创建一个以该字符串命名的类的对象。在 Java 中,我会使用 Class.forName().newInstance()
。 Python 中是否有等效项?
感谢您的回复。回答那些想知道我在做什么的人:我想使用命令行参数作为类名,并将其实例化。我实际上是在用 Jython 编程并实例化 Java 类,因此问题的 Java 特性。 getattr()
效果很好。非常感谢。
原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议
Python 中的反射比 Java 中的反射简单得多,也灵活得多。
我推荐阅读本 教程(在 archive.org 上)
没有直接函数(据我所知)采用完全限定的类名并返回该类,但是您拥有构建它所需的所有部分,并且可以将它们连接在一起。
不过有一点建议:当您使用 Python 时,不要尝试以 Java 风格编程。
如果您可以解释您要尝试做什么,也许我们可以帮助您找到一种更符合 Python 风格的方法。
这是一个可以执行您想要的操作的功能:
您可以像使用类本身一样使用此函数的返回值。
这是一个用法示例:
这是如何运作的?
我们正在使用
__import__
导入包含该类的模块,这要求我们首先从完全限定名称中提取模块名称。然后我们导入模块:在这种情况下,
m
将只引用顶层模块,例如,如果您的课程位于
foo.baz
模块中,那么m
将是模块foo
我们可以使用
getattr( m, 'baz' )
轻松获得对foo.baz
的引用 —要从顶层模块到类,必须在类名的部分递归使用
gettatr
例如,如果您的类名是
foo.baz.bar.Model
那么我们这样做:这就是这个循环中发生的事情:
在循环结束时,
m
将是对该类的引用。这意味着m
实际上是 itslef 类,你可以这样做: