'__main__'在type()的输出中是什么意思

时间:2019-01-03 08:25:20

标签: python python-3.x python-2.7

如果我如下创建一个类,并检查对象的类型,则会得到以下输出。

我的问题是__main__在这里是什么意思?

class Student(object):
    pass

>>>a = Student()
>>>type(a)
<class '__main__.Student'>

还有另一个问题,如果我检查Student类的类型,则会得到以下输出。

>>>type(Student)
<class 'type'>

<class 'type'>在这里是什么意思?

2 个答案:

答案 0 :(得分:3)

  

我的问题是'__main__'在这里是什么意思?

__main__中有一个模块,其中定义了Student;与您使用Python解释器启动的文件相对应的模块会自动命名为__main__。您可能会记得平时的习惯用法

if __name__ == '__main__':
    ...

检查当前模块的名称是否为__main__,以查看这是否是已运行的脚本(与将其作为模块导入相反)。

如果您在另一个文件中定义了Student,并从您的主模块中导入了该文件,它会说出该模块的名称。例如:

run.py

import student

class Student(object):
    pass

a = student.Student()
print(type(a))

b = Student()
print(type(b))

student.py

class Student(object):
    pass

如果您运行python run.py,将会得到

<class 'student.Student'>
<class '__main__.Student'>

您将看到确认点号之前的名称确实是定义给定类型的模块(在这种情况下,用于消除歧义并一目了然地定义了给定类型是有用的)。 / p>


  

<class 'type'>在这里是什么意思?

这意味着Student (与用class定义的所有类一样,反过来又是内置类型{{的实例) 1}}。它可能会有点循环,但是类本身是元类的实例;关于引擎盖如何工作的所有细节,您可以看一下at this question,但阅读起来并不轻松。

答案 1 :(得分:2)

__main__中的'__main__.Student'表示Student对象(或类)是在执行顶级代码的范围(__main__范围)中定义的。如果Student类是在另一个模块中定义的,则将其命名为imported_module并导入到主作用域中,则print(type(a))将输出imported_module.Student。因此,基本上,对象的类型总是引用其定义的范围。