1. Python中的__init__.py有什么用?
__init__.py
是一个特殊的文件名,用于标识一个 Python 包(package)。
在 Python 中,一个包就是一个包含多个模块的文件夹,该文件夹下必须包含一个名为 __init__.py
的文件,用于告诉 Python 这是一个包,并且可以在该包中导入其他模块。
__init__.py
文件有以下几个常见用途:
- 初始化包:
__init__.py
文件可以包含初始化代码,例如设置模块级别的变量或者执行某些必要的操作。这些初始化代码在导入包时会被自动执行。 - 控制包导入:
__init__.py
文件可以控制哪些模块可以被导入。例如,可以在__init__.py
文件中设置一个列表变量,包含允许被导入的模块名,然后在其他模块中引用该变量,以限制导入范围。 - 提供包级别的 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__
- 控制
from <package> import *
语句的导入内容:当你使用from <package> import *
语句时,Python 会按照__all__
列表中定义的名称来导入相应的对象。如果__all__
列表不存在或为空,则默认导入所有公共对象(即所有没有以_
- 显示包或模块的公共接口:在包或模块中使用
__all__
例如,在一个名为 mypackage
的包的 __init__.py
文件中,你可以定义一个 __all__
__all__ = ['module1', 'module2', 'hello']
from .module1 import *
from .module2 import *
def hello():
print('Hello from mypackage!')
在这个例子中,__all__
列表包含了 module1
、module2
和 hello
这三个公共对象的名称,因此当你使用 from mypackage import *
总之,__all__