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 * 时导入的内容,增强封装性和控制导入行为。
💬 评论区