【问题标题】:What does '__main__' mean in the output of type() [closed]'__main__' 在 type() 的输出中是什么意思 [关闭]
【发布时间】:2019-01-03 08:25:19
【问题描述】:

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

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

class Student(object):
    pass

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

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

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

&lt;class 'type'&gt; 在这里是什么意思?

【问题讨论】:

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


【解决方案1】:

我的问题是'__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'>

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


&lt;class 'type'&gt; 在这里是什么意思?

这意味着Student ,就像所有用class 定义的类一样,又是内置类型type一个实例。它可能有点循环,但类本身就是元类的实例;对于所有关于它如何在引擎盖下工作的血腥细节,你可以看看at this question,但这不是简单的阅读。

【讨论】:

    【解决方案2】:

    '__main__.Student' 中的 __main__ 表示 Student 对象(或类)是在执行顶级代码的范围(__main__ 范围)中定义的。如果Student 类在另一个模块中定义,称为imported_module,并导入到主作用域中,那么print(type(a)) 将输出imported_module.Student。所以基本上,对象的类型总是指回定义它的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2017-06-08
      • 2022-01-01
      • 1970-01-01
      • 2010-12-29
      • 2014-09-20
      • 1970-01-01
      相关资源
      最近更新 更多