Skip to main content

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