python 中的反射比 Java 中的反射要容易得多,也灵活得多。
我推荐阅读这个tutorial
没有直接函数(据我所知)接受完全限定的类名并返回该类,但是您拥有构建该类所需的所有部分,并且可以将它们连接在一起。
不过有一点建议:当你在 python 中时,不要尝试用 Java 风格编程。
如果你能解释你想要做什么,也许我们可以帮助你找到一种更 Pythonic 的方式。
这里有一个功能可以满足你的需求:
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
您可以像使用类本身一样使用此函数的返回值。
这是一个用法示例:
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
它是如何工作的?
我们使用__import__ 来导入包含该类的模块,这要求我们首先从完全限定名称中提取模块名称。然后我们导入模块:
m = __import__( module )
在这种情况下,m 只会引用顶层模块,
例如,如果您的班级位于 foo.baz 模块中,那么 m 将是模块 foo
我们可以使用getattr( m, 'baz' )轻松获得对foo.baz的引用
要从顶层模块到类,必须在类名部分递归使用gettatr
例如,如果您的班级名称是foo.baz.bar.Model,那么我们这样做:
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
这就是这个循环中发生的事情:
for comp in parts[1:]:
m = getattr(m, comp)
在循环结束时,m 将是对该类的引用。这意味着m 实际上是它的类,你可以这样做:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor