Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用globals()创建类对象_Python_Globals_Locals - Fatal编程技术网

Python 使用globals()创建类对象

Python 使用globals()创建类对象,python,globals,locals,Python,Globals,Locals,我是编程新手,所以请不要因为问愚蠢的问题就杀了我。 我一直在试图理解Python中所有的类业务,我已经到了一个地步,仅仅通过google it无法找到我的问题的答案 在我的程序中,我需要根据函数返回的字符串从其他类中调用一个类。我找到了两种解决方案:一种是使用getattr(),另一种是使用globals()/locals() 我决定采用第二种解决方案,并让它发挥作用,但我真的不明白它是如何发挥作用的 下面是代码示例: class Test(object): def __init__(s

我是编程新手,所以请不要因为问愚蠢的问题就杀了我。 我一直在试图理解Python中所有的类业务,我已经到了一个地步,仅仅通过google it无法找到我的问题的答案

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

我决定采用第二种解决方案,并让它发挥作用,但我真的不明白它是如何发挥作用的

下面是代码示例:

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

room = globals()['Test'] 
room()
类型(room())
给出:

<class '__main__.Test'>
<type 'type'> # What????
<class '__main__.Test'>
<type 'type'> # What????
看起来
room()
是一个类对象,但它不应该是
room
而不是
room()


请帮助我,因为如果我写了一个我自己都不懂的代码,那有点傻。

首先,我会选择
getattr

在您的示例中,
room
等于
Test
,是一个类。它的类型是
类型


调用
room()
时,实例化
Test
,因此
room()
计算为
Test
的一个实例,其类型为
Test

,这里发生的情况如下:

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

room = globals()['Test']
这里是
Test
as
room
您想要的方式。验证这一点:

room is Test
应给出
真值

类型(room())
给出:

<class '__main__.Test'>
<type 'type'> # What????
<class '__main__.Test'>
<type 'type'> # What????
当然,这是一种(新式)课程。与
类型(测试)
相同


但是,请注意,对于

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


最好创建一个显式独立的dict。在这里,您可以完全控制哪些对象/类/。。。在该上下文中允许,但不允许。在Python中,类也是对象。所有这些都是为了:

class Test(object):
    def __init__(self):
        print "WORKS!"
创建一个类对象并将其绑定到名称
Test
。尽管如此:

x = []
创建列表对象并将其绑定到名称
x

Test()
不是创建实例的神奇语法。
测试是非常普通的变量查找,
()
是非常普通的“带空参数的调用”。恰好调用一个类将创建该类的实例

如果是这样的话,那么实例化基于将类名作为字符串选择的类的问题可以归结为查找存储在变量中的对象这一简单得多的问题。这与将列表绑定到名称
x
,给定字符串
“x”
,问题完全相同。一旦在任何旧变量中获得了对类的引用,就可以简单地调用它来创建实例

globals()。因此
globals()。然而,像这样使用
globals()
通常不是很好的风格;您的模块可能包含大量可调用项(包括从其他模块导入的一组),如果可以使函数返回它们的名称,您不希望意外调用这些可调用项。鉴于类只是普通对象,您可以将它们放入自己制作的词典中:

classes = {
    'Test': Test,
    'SomethingElse': Something,
    ...
}
这需要更多的键入,但也更容易看到预期用途,并且它给了您更多的灵活性,因为您还可以轻松地将此字典传递给其他模块,并在其他地方进行实例化(您可以使用
globals()
,但是您会变得非常奇怪)

现在,对于
类型(房间)
类型
。同样,这只是类本身也是对象这一事实的简单结果。如果一个类是一个对象,那么它也应该是某个类的实例。那是什么课<代码>类型
,即“类型的类型”。就像任何类定义其所有实例的公共行为一样,类
type
定义所有类的公共行为

为了伤脑筋,
type
本身就是一个例子(因为
type
也是一个类,
type
是类的一个类)。它是
对象
的一个子类(因为所有
类型
实例都是
对象
实例,但并非所有
对象
实例都是
类型
实例),也是
对象
的一个实例(因为
对象
是所有对象都是实例的根类)


但是,您通常可以将
类型作为高级主题忽略。:)

谢谢,我现在明白我有多不明白了:)哇,除了最后一部分关于type
type
的内容外,这解释了很多:)谢谢你的帮助。