Python的模块化编程

Python的模块化编程

导入方式

python的导入方式主要有俩种,import 模块名from 模块名 import 成员

俩者的区别主要体现在导入范围、使用方式和命名空间影响三个方面,具体如下:

1.导入范围不同

import 模块名 [as 别名]

导入的是整个模块(包括模块内的所有成员,如函数、类、变量等),但不会将模块内的具体成员直接暴露在当前作用域,而是将 “模块本身” 作为一个对象导入。例如:import math 会导入整个 math 模块,但 math 里的 sinpi 等成员不会直接可用,需要通过模块名访问。

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 里没提到过的子模块

posted @ 2025-12-15 11:08  人生何处不青山啊  阅读(2)  评论(0)    收藏  举报