模块
绝对导入和相对导入为 Python 包的组织提供了清晰的规则。明确的导入方式让代码的依赖关系更加清晰,避免了命名冲突。
# 绝对导入
from mypackage.submodule import function
# 相对导入
from .submodule import function
from ..parentmodule import other_function
模块
模块表示一个或多个具有相关功能的 Python 代码的集合。
最小的模块是单个 Python 可执行文件。最常见的是 .py 后缀结尾的文件。
较大的模块往往是一个文件夹,内含多个 Python 可执行文件、文件夹与资源等等。
Python 的 import 不止能导入 .py 后缀结尾的文件
.pyd 是 Windows 特有的文件格式。它的作用和 .dll 相似,可直接导入而不需要 ctypes 模块。
.pyc 是由 py 文件经过编译后生成的二进制文件,py 文件变成 .pyc 文件后,加载的速度有所提高,并且可以实现源码隐藏。
Python 的 import 通过 importlib 模块自动处理这些不同格式的文件。
.so 和 .dll 分别是 Linux 和 Windows 的动态链接库,可使用 ctypes 模块导入。
.pyx 是 Cython 的源代码文件,支持 Python 与 C 代码混合编程。可以将 .pyx 文件编译为纯 C 文件,但需要注意的是,这个 C 文件通常是用来创建一个 Python 扩展模块的,它不能独立运行。需要进一步编译为 .so 或 .dll 或 .pyd 文件。
.pyi 文件是 Python 接口文件(Python Interface file),也称为存根文件(stub file)。它包含模块的类型提示,但不包含实际的实现代码。当一个模块是用 C 或 Cython 编写的(例如,编译成 .pyd 或 .so 文件),它的源代码不是 Python 格式,因此无法直接被 MyPy、Pyright 等类型检查器或 IDE 识别。这时,开发者会创建一个对应的 .pyi 文件来提供类型信息。
from,import,as
在导入模块时,可以使用from、import、as关键字来导入模块中的指定内容。
通过import关键字导入指定的模块。
通过from关键字从模块中导入指定内容。
通过as关键字给函数别名。
def foo():
print('goodbye, world!')
import module # 导入整个模块文件
module.foo()# 输出goodbye, world!
from module import foo # 从模块中导入foo函数
foo() # 输出goodbye, world!
from module import foo as foo2 # 导入模块中的foo函数,并别名为foo2
foo2() # 输出goodbye, world!
__name__ 属性
__name__ 属性是一个特殊的属性,用于获取模块的名称。
print(__name__)
"""
当模块被直接运行时,__name__的值为__main__,即便在多线程和协程中也是__main__
3.14多进程中,会将子进程的__name__设为__mp_main__
当模块被导入时,__name__的值为模块的名称,即module
如果你希望在模块被直接运行时执行一些代码,被导入时则不执行,可以这样写:
"""
if __name__ == "__main__":
print("This is the main module")
模块的其他特殊属性(魔法变量)
除了 __name__ 外,Python 模块还有一系列由解释器自动设置或约定的特殊属性,常用于内省、文档和加载逻辑。
| 属性 | 说明 |
|---|---|
__doc__ | 模块的文档字符串(即文件开头的多行字符串),若未定义则为 None。 |
__file__ | 加载该模块时使用的文件路径(若从文件加载)。交互式环境、内置模块或动态生成的模块可能没有此属性。 |
__package__ | 模块所属的包名。顶层模块为 '',包内模块为包名(如 mypkg.sub |