【问题标题】:What is the difference between __init__.py and __main__.py? [duplicate]__init__.py 和 __main__.py 有什么区别? [复制]
【发布时间】:2015-09-28 10:26:34
【问题描述】:

我知道这两个关于__init__.py__main__.py的问题:

What is __init__.py for?

What is __main__.py?

但我真的不明白它们之间的区别。或者我可以说我不明白它们是如何相互作用的。

【问题讨论】:

  • 您链接的两个问题的答案完全不同。你有什么困惑?

标签: python python-3.x


【解决方案1】:

__init__.py,除其他外,将目录标记为 python 目录,并允许您在包范围级别设置变量。

__main__.py 会在您尝试运行一组压缩的 python 文件时运行。 __main__.py 允许你执行包。

这两个答案都是从您链接的答案中获得的。关于这些事情,你还有什么不明白的吗?

【讨论】:

    【解决方案2】:

    __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
    猜你喜欢
    • 2011-04-24
    • 2011-05-01
    • 2017-12-12
    • 2013-09-03
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多