在 Python 中,类也是对象。所有这一切:
class Test(object):
def __init__(self):
print "WORKS!"
是创建一个类对象并将其绑定到 name Test
。就像这样:
x = []
创建一个列表对象并将其绑定到 name x
。
Test()
不是创建实例的神奇语法。这Test
是非常普通的变量查找,()
也是非常普通的“使用空参数调用”。碰巧调用一个类将创建该类的一个实例。
如果遵循那么您将基于将类名称作为字符串选择的类实例化的问题归结为查找存储在变量中的对象的简单得多的问题。x
给定字符串,这与将列表绑定到 name 完全相同的问题"x"
。一旦您在任何旧变量中获得了对该类的引用,您就可以简单地调用它来创建您的实例。
globals()
返回一个字典,将全局变量的名称映射到它们的值。因此globals()['Test']
,您将获得课程Test
,就像globals()['x']
获得列表一样容易。然而,这样使用通常不被认为是很好的风格globals()
;如果可以使函数返回它们的名称,您的模块可能包含大量可调用对象(包括从其他模块导入的一堆),您不希望被意外调用。鉴于类只是普通对象,您可以将它们放入自己制作的字典中:
classes = {
'Test': Test,
'SomethingElse': Something,
...
}
这涉及更多的输入,但也更容易看到预期的用途,并且它为您提供了更多的灵活性,因为您还可以轻松地将此字典传递给其他模块并在其他地方进行实例化(您可以这样做,globals()
但是你会变得很奇怪)。
现在,type(room)
暂时type
。同样,这只是类本身也是对象这一事实的简单结果。如果一个类是一个对象,那么它也应该是某个类的一个实例。那是什么课?type
,“类型的类型”。就像任何类定义其所有实例的共同行为一样,该类type
定义所有类的共同行为。
而只是为了让你的大脑受伤,type
是它自己的一个实例(因为type
也是一个类,并且type
是类的类)。它是object
(因为所有type
实例都是object
实例,但并非所有object
实例都是type
实例)的子类,也是object
(因为object
是所有事物都是实例的根类)的实例。
但是,您通常可以type
将其视为高级主题而忽略。:)