在Python中的反射
在Python中的反射
我正在尝试找到关于Python反射的一些信息。我找到了维基百科上的一篇文章,其中提供了以下代码片段:\n
# 无反射 Foo().hello() # 使用反射 getattr(globals()['Foo'](), 'hello')()
\n我无法使其工作。我真正需要的是一种只实例化对象的方法。所以如果我有一个字符串\'Foo\',我想要能够得到一个类型为Foo的对象。就像在Java中我可以说:Class.forName(\"Foo\")。\n刚刚找到了这个...不知道为什么以前找不到:\nPython有没有类似于Java的Class.forName()的等效方法?
在上述内容中,出现了一个关于Python中反射的问题。问题的原因是需要一种方法来实例化一个对象。解决方法是使用globals()['Foo']()
来实现。
Python中的globals
是一个返回全局变量字典的函数。globals()
调用该函数,从而获得该字典。globals()['Foo']
在该字典中查找键为'Foo'的值,这样就得到了Foo
全局变量的值。
通过globals()['Foo']()
可以实例化Foo
对象。以下是一个示例:
class Foo: def __init__(self): print "Created a Foo!" globals()['Foo']()
执行以上代码,会输出:
Created a Foo!
<__main__.Foo instance at 0x02A33350>
另一方面,f = ['Foo']()
是一个语法错误。这是因为列表不可调用。将字符串'Foo'放入列表中,并尝试调用该列表,会导致TypeError
错误。
使用globals()['Foo']()
可以通过反射来实例化对象,而f = ['Foo']()
的方式是错误的。Python中的反射相比Java要简单得多。