使用globals()创建类对象

S1a*_*wek 3 python locals globals

我是编程的新手,所以请不要因为提出愚蠢的问题而杀了我.我一直在努力理解Python中的所有类业务,我到了无法通过谷歌找到我的问题的答案.

在我的程序中,我需要根据函数返回的字符串从其他类中调用一个类.我发现了两种解决方案:一种是使用getattr(),另一种是使用globals()/ locals().

决定采用第二种解决方案并使其正常工作,但我真的不明白它是如何工作的.

所以有代码示例:

class Test(object):
    def __init__(self):
        print "WORKS!"

room = globals()['Test'] 
room()
Run Code Online (Sandbox Code Playgroud)

type(room()) 得到:

<class '__main__.Test'>
Run Code Online (Sandbox Code Playgroud)

type(room) 得到:

<type 'type'> # What????
Run Code Online (Sandbox Code Playgroud)

它看起来像是room()一个类对象,但不应该room代替room()

请帮助我,因为如果我编写一些我不了解的代码,这有点傻.

glg*_*lgl 5

这里发生的是以下内容:

class Test(object):
    def __init__(self):
        print "WORKS!"

room = globals()['Test']
Run Code Online (Sandbox Code Playgroud)

在这里,你得到Testroom,你想要的方式.验证这个:

room is Test
Run Code Online (Sandbox Code Playgroud)

应该给True.

type(room()) 得到:

<class '__main__.Test'>
Run Code Online (Sandbox Code Playgroud)

你向后退一步:room()返回与Test()那个 - 该类的一个实例相同的内容.type()"撤消"这一步骤.获取对象的类型 - 当然,这是Test.

type(room) 得到:

<type 'type'> # What????
Run Code Online (Sandbox Code Playgroud)

当然 - 它是(新风格)类的类型.同样的type(Test).


但请注意,对于

在我的程序中,我需要根据函数返回的字符串从其他类中调用一个类.我发现了两种解决方案:一种是使用getattr(),另一种是使用globals()/ locals().

创建一个明确单独的dict可能会更好.在这里,您可以完全控制在该上下文中允许哪些对象/类/ ...,哪些不是.