1. Python中的__init__.py有什么用?

__init__.py 是一个特殊的文件名,用于标识一个 Python 包(package)。

在 Python 中,一个包就是一个包含多个模块的文件夹,该文件夹下必须包含一个名为 __init__.py 的文件,用于告诉 Python 这是一个包,并且可以在该包中导入其他模块。

__init__.py 文件有以下几个常见用途:

  1. 初始化包:__init__.py 文件可以包含初始化代码,例如设置模块级别的变量或者执行某些必要的操作。这些初始化代码在导入包时会被自动执行。
  2. 控制包导入:__init__.py 文件可以控制哪些模块可以被导入。例如,可以在 __init__.py 文件中设置一个列表变量,包含允许被导入的模块名,然后在其他模块中引用该变量,以限制导入范围。
  3. 提供包级别的 API:__init__.py 文件可以定义包级别的 API,使得其他模块可以更方便地使用该包。例如,可以在 __init__.py 文件中定义一个函数或者类,然后在其他模块中直接通过包名来访问该函数或者类。

总之,__init__.py 文件是 Python 包中必不可少的一部分,用于初始化和控制包的导入,以及提供包级别的 API。

2. 例子

当你创建一个名为 mypackage 的 Python 包时,必须在该包的根目录下创建一个名为 __init__.py

# 在 __init__.py 中初始化包级别的变量
VERSION = '1.0.0'

# 在 __init__.py 中定义包级别的函数
def hello():
    print(f'Hello from mypackage {VERSION}!')

# 在 __init__.py 中导入其他模块
from .module1 import *
from .module2 import *

上面的代码定义了一个名为 mypackage

  • VERSION
  • hello()
  • from .module1 import *from .module2 import * 语句导入了 mypackage 中的其他模块,使得这些模块的内容可以在 mypackage

有了这个 __init__.py 文件,你就可以在 Python 中使用 import mypackage

import mypackage

mypackage.hello()  # 输出:Hello from mypackage 1.0.0!

或者直接导入包中的某个模块:

from mypackage import module1

module1.some_function()  # 调用 mypackage.module1 中的某个函数

总之,__init__.py

3. __init__.py中的__all__列表有什么用?

在 Python 的包中,__all__ 是一个可选的特殊变量,用于定义包或模块的公共接口。它是一个字符串列表,其中每个字符串表示一个可以从包或模块中导入的公共对象的名称。如果在包中使用了 __all__ 变量,则它会影响到 from <package> import *

具体来说,__all__

  1. 控制 from <package> import * 语句的导入内容:当你使用 from <package> import * 语句时,Python 会按照 __all__ 列表中定义的名称来导入相应的对象。如果 __all__ 列表不存在或为空,则默认导入所有公共对象(即所有没有以 _
  2. 显示包或模块的公共接口:在包或模块中使用 __all__

例如,在一个名为 mypackage 的包的 __init__.py 文件中,你可以定义一个 __all__

__all__ = ['module1', 'module2', 'hello']

from .module1 import *
from .module2 import *

def hello():
    print('Hello from mypackage!')

在这个例子中,__all__ 列表包含了 module1module2hello 这三个公共对象的名称,因此当你使用 from mypackage import *

总之,__all__