Python 使用globals()创建类对象
我是编程新手,所以请不要因为问愚蠢的问题就杀了我。 我一直在试图理解Python中所有的类业务,我已经到了一个地步,仅仅通过google it无法找到我的问题的答案 在我的程序中,我需要根据函数返回的字符串从其他类中调用一个类。我找到了两种解决方案:一种是使用Python 使用globals()创建类对象,python,globals,locals,Python,Globals,Locals,我是编程新手,所以请不要因为问愚蠢的问题就杀了我。 我一直在试图理解Python中所有的类业务,我已经到了一个地步,仅仅通过google it无法找到我的问题的答案 在我的程序中,我需要根据函数返回的字符串从其他类中调用一个类。我找到了两种解决方案:一种是使用getattr(),另一种是使用globals()/locals() 我决定采用第二种解决方案,并让它发挥作用,但我真的不明白它是如何发挥作用的 下面是代码示例: class Test(object): def __init__(s
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
asroom
您想要的方式。验证这一点:
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
是类的一个类)。它是对象
的一个子类(因为所有类型
实例都是对象
实例,但并非所有对象
实例都是类型
实例),也是对象
的一个实例(因为对象
是所有对象都是实例的根类)
但是,您通常可以将类型作为高级主题忽略。:) 谢谢,我现在明白我有多不明白了:)哇,除了最后一部分关于typetype
的内容外,这解释了很多:)谢谢你的帮助。