【发布时间】:2015-09-28 10:26:34
【问题描述】:
我知道这两个关于__init__.py和__main__.py的问题:
但我真的不明白它们之间的区别。或者我可以说我不明白它们是如何相互作用的。
【问题讨论】:
-
您链接的两个问题的答案完全不同。你有什么困惑?
标签: python python-3.x
我知道这两个关于__init__.py和__main__.py的问题:
但我真的不明白它们之间的区别。或者我可以说我不明白它们是如何相互作用的。
【问题讨论】:
标签: python python-3.x
__init__.py,除其他外,将目录标记为 python 目录,并允许您在包范围级别设置变量。
__main__.py 会在您尝试运行一组压缩的 python 文件时运行。 __main__.py 允许你执行包。
这两个答案都是从您链接的答案中获得的。关于这些事情,你还有什么不明白的吗?
【讨论】:
__init__.py 在您将包导入 到正在运行的 python 程序中时运行。例如,程序中的import idlelib 运行idlelib/__init__.py,它不做任何事情,因为它的唯一目的是将idlelib 目录标记为一个包。另一方面,tkinter/__init__.py 包含大部分 tkinter 代码并定义了所有小部件类。
__main__.py 会作为“__main__”运行。例如,命令行中的python -m idlelib 运行idlelib/__main__.py,这会启动Idle。同样,python -m tkinter 运行 tkinter/__main__.py,它有这样一行:
from . import _test as main
在这种情况下,. 是tkinter,因此导入. 会导入tkinter,它运行tkinter/__init__.py。 _test 是在该文件中定义的函数。所以调用main()(下一行)和在命令行运行python -m tkinter.__init__的效果是一样的。
【讨论】:
tkinter 在__init__.py 文件中有很多代码,而idlelib 没有代码?您是否有理由有时希望在 __init__.py 中有代码,但有时却没有?
package/__init__.py 中的代码使import package 实际执行某些操作。在 3.0 之前,Tkinter 是一个模块,而不是一个包。在 3.0 中,Tkinter.py 中的代码被放入 tkinter/__init__.py, so the only change needed was import tkinter` 而不是 import Tkinter。