在Python中的反射

18 浏览
0 Comments

在Python中的反射

我正在尝试找到关于Python反射的一些信息。我找到了维基百科上的一篇文章,其中提供了以下代码片段:\n

# 无反射
Foo().hello()
# 使用反射
getattr(globals()['Foo'](), 'hello')()

\n我无法使其工作。我真正需要的是一种只实例化对象的方法。所以如果我有一个字符串\'Foo\',我想要能够得到一个类型为Foo的对象。就像在Java中我可以说:Class.forName(\"Foo\")。\n刚刚找到了这个...不知道为什么以前找不到:\nPython有没有类似于Java的Class.forName()的等效方法?

0
0 Comments

在上述内容中,出现了一个关于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要简单得多。

0