03-模块
模块
模块是一个包含 Python 定义和语句的文件,文件名是 以 “.py” 结尾。模块可以包含函数、类和变量、也可以包含可执行的代码。模块的作用是提高代码的组织性和复用性。
- 创建模块:只需创建一个 .py 文件。
示例:math_utils.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
- 导入模块:
import math_utils
result = math_utils.add(5, 3)
print(result) # 输出: 8
- 从模块中导入特定函数:
from math_utils import add
print(add(2, 4)) # 输出: 6
包
包是一个包含多个模块的目录,目录中必须包含一个
__init__.py
的文件(可以为空),用来标识这个目录是一个包。包允许模块的层次化组织,便于管理大型项目。
- 包的结构示例:
my_package/
├── __init__.py
├── math_utils.py
└── string_utils.py
- 导入包中的模块:
from my_package import math_utils
print(math_utils.add(5, 2)) # 输出: 7
- 多层包结构:
my_package/
├── __init__.py
├── sub_package/
│ ├── __init__.py
│ └── advanced_math.py
from my_package.sub_package import advanced_math
__all__
的作用
__all__
是一个定义在模块或包中的列表,指定了当使用from module import *
语法时,哪些属性、函数或类会被导入。
1、不使用 __all__
的默认行为
- 如果模块中没有定义
__all__
,使用from module import *
时,不会导入以下划线_开头
的对象,但会导入其它所有定义的函数、类和变量。
示例:example.py
def func_a():
return "A"
def func_b():
return "B"
_hidden_func = lambda: "Hidden"
from example import *
print(func_a()) # 输出: A
print(func_b()) # 输出: B
# print(_hidden_func()) # 报错:'_hidden_func' 未定义
2、使用 __all__
控制导入内容
- 定义
__all__
可以精确控制from module import *
时哪些名称会被导入。
示例:example.py
__all__ = ['func_a'] # 只允许 func_a 被导入
def func_a():
return "A"
def func_b():
return "B"
def func_c():
return "C"
from example import *
print(func_a()) # 输出: A
# print(func_b()) # 报错:'func_b' 未定义
# print(func_c()) # 报错:'func_c' 未定义
3、__all__
在包中的使用
- 在包的
__init__.py
中定义__all__
,可以控制使用from package import *
时,哪些模块会被导入。
包结构:
my_package/
├── __init__.py
├── math_utils.py
└── string_utils.py
__init__.py
__all__ = ['math_utils'] # 只导入 math_utils 模块
使用:
from my_package import *
print(math_utils.add(1, 2)) # 正常工作
# print(string_utils.some_function()) # 报错:'string_utils' 未定义
总结
1、模块(Module):是一个 .py 文件,包含函数、类或变量。
2、包(Package):是一个包含多个模块的目录,必须有 __init__.py
文件。
3、__all__
:用来控制 from module import *
或 from package import *
时导入的内容,增强封装性和控制导入行为。