如果我如下创建一个类,并检查对象的类型,则会得到以下输出。
我的问题是__main__
在这里是什么意思?
class Student(object):
pass
>>>a = Student()
>>>type(a)
<class '__main__.Student'>
还有另一个问题,如果我检查Student类的类型,则会得到以下输出。
>>>type(Student)
<class 'type'>
<class 'type'>
在这里是什么意思?
答案 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
。因此,基本上,对象的类型总是引用其定义的范围。