Python的模块化编程
Python的模块化编程
导入方式
python的导入方式主要有俩种,import 模块名 和 from 模块名 import 成员。
俩者的区别主要体现在导入范围、使用方式和命名空间影响三个方面,具体如下:
1.导入范围不同
import 模块名 [as 别名]:
导入的是整个模块(包括模块内的所有成员,如函数、类、变量等),但不会将模块内的具体成员直接暴露在当前作用域,而是将 “模块本身” 作为一个对象导入。例如:import math 会导入整个 math 模块,但 math 里的 sin、pi 等成员不会直接可用,需要通过模块名访问。
from 模块名 import 成员 [as 别名]:
只导入模块中指定的成员(可以是一个或多个),且直接将这些成员暴露在当前作用域,不需要通过模块名访问。例如:from math import sin, pi 仅导入 sin 函数和 pi 变量,且在当前代码中可直接使用 sin() 或 pi。
2.使用时的访问方式不同
import 模块名 导入后:
必须通过「模块名。成员名」的方式访问成员(或用别名:「别名。成员名」)。
import math
print(math.pi) # 必须通过模块名访问
print(math.sin(0))
# 用别名的情况
import math as m
print(m.pi) # 通过别名访问
from 模块名 import 成员 导入后:
可以直接使用成员名(或别名)访问,无需带模块名。
from math import pi, sin
print(pi) # 直接使用成员名
print(sin(0))
# 用别名的情况
from math import pi as p
print(p) # 直接使用别名
3.对当前命名空间影响不同
import 模块名:
只会在当前命名空间中新增一个 “模块名”(或其别名)的变量,指向整个模块对象,不会污染当前命名空间(模块内的成员不会直接暴露,避免命名冲突)。
例如:导入 math 后,当前命名空间只有 math 这个变量,math 内部的 sin 等成员不会和当前代码中的变量冲突。
from 模块名 import 成员:
会将导入的成员直接添加到当前命名空间,可能导致命名冲突(如果当前代码中已有同名变量 / 函数)。例如:
pi = 3.14 # 当前代码中已有 pi 变量
from math import pi # 导入 math 中的 pi,会覆盖当前的 pi
print(pi) # 输出 3.141592653589793(被覆盖)
模块写测试代码
每个 Python 模块都有一个内置的__name__变量。
当直接用python 模块名.py运行这个模块时,__name__的值会被设为'__main__'。
当这个模块被导入到其他程序中时,__name__的值会变成 “模块名”(即模块文件的文件名,不带.py后缀)。
我们可以利用__name__ == '__main__'的判断,让模块里的测试代码(比如函数调用、调试语句)只在 “直接运行模块” 时执行**,而 “被导入到其他程序时” 不执行(避免污染其他代码)。
# 假设这是module1.py中的代码
def test_my_book():
print("这是module 1")
def test_say_hi():
print("疯狂Python讲义")
def test_User():
print("孙悟空,您好,欢迎学习Python")
print("User[name=Charlie],您好,欢迎学习Python")
print("白骨精正在慢慢地走路")
print("User[name=白骨精]")
# 关键判断:只有直接运行module1.py时,才执行下面的测试函数
if __name__ == '__main__':
test_my_book()
test_say_hi()
test_User()
导包总结
跟JAVA一样Python也可以通过包来管理代码结构,而包下面默认会带一个__init__.py的文件,而这个文件的作用呢就是用来当其他模块导入包时,它能来控制跳过复杂的子模块路径、直接访问核心接口,是 “让这些导入方式能简洁生效” 的核心。例子:
from .auth_service import AuthService
from .models import User, Role, TaskCategory, UserSession
from .decorators import login_required, admin_required, permission_required
from .ldap_auth import LDAPAuthenticator
__all__ = [
"AuthService",
"User",
"Role",
"TaskCategory",
"UserSession",
"login_required",
"admin_required",
"permission_required",
"LDAPAuthenticator",
]
别的模块就可以通过from auth import User, AuthService的方式导入。
import auth 只会加载 auth 包本身(执行 __init__.py),以及 __init__.py 中 “间接触发加载” 的子模块 —— 完全不会加载 __init__.py 里没提到过的子模块。

浙公网安备 33010602011771号