Python 模块与包的使用指南

一、模块简介

1.1 什么是模块

  • 在 Python 中,一个后缀名为 .py 的文件就是一个模块。

  • 模块中可以定义函数、类、变量等。

  • 模块的作用:

    • 避免函数、类、变量等名称冲突。

    • 提高代码的可维护性和可重用性。

1.2 模块的命名规范

  • 模块名应全部使用小写字母,多个单词之间用下划线分隔,例如 my_module

  • 避免使用 Python 的保留字(如 liststr 等)作为模块名。

  • 模块名应简洁且具有描述性,避免与标准库或第三方库的模块名冲突。

1.3 模块的初始化代码

  • 模块文件中可以直接包含可执行代码(如打印语句、函数调用等),这些代码会在模块被导入时自动执行一次。

  • 如果不想在导入时执行某些代码,可以将其放在 if __name__ == '__main__': 块中,这样只有在直接运行该模块文件时才会执行。

二、自定义模块

2.1 自定义模块的定义

  • 自定义模块是一个以 .py 结尾的文件。

  • 新建 Python 文件,实际上就是在新建模块。

  • 自定义模块的作用:

    • 规范代码,将功能相同的函数、类等封装到一个模块中,让代码更易于阅读。

    • 可以被其他模块调用,提高开发效率。

2.2 示例:自定义模块

文件:my_info.py

name = 'kyle'

def introduce():
    print(f'My name is {name}')

三、模块的调用

3.1 导入模块的方式

  • import 导入方式

    • 语法:import 模块名称 [as 别名]

    • 示例:

      import my_info
      print(my_info.name)  # 输出:kyle
      my_info.introduce()  # 输出:My name is kyle
      
  • from ... import 导入方式

    • 语法:from 模块名称 import 变量/函数/类/*

    • 示例:

      from my_info import name
      print(name)  # 输出:kyle
      
  • 使用通配符 *

    • 语法:from 模块名称 import *

    • 注意:如果模块中定义了 __all__ 列表,那么只有 __all__ 中列出的变量、函数或类会被导入。

    • 示例:

      from my_info import *
      print(name)  # 输出:kyle
      introduce()  # 输出:My name is kyle
      

3.2 导入多个模块

  • 使用英文逗号分隔多个模块名:
    import math, time, random
    

3.3 解决模块冲突

  • 如果导入的模块中有同名的变量或函数,后导入的会覆盖先导入的。
    # 模块:my_info
        name = 'kyle'
    
        def introduce():
            print(f'my name is {name}')
    # 模块:introduce
        name = 'rock'
        age = '20'
        def introduce():
            print(f'my name is {name} and age {age}')
    # 导入模块
    from my_info import *
    from introduce import *
    # 导入模块中具有同名的变量和函数,后导入的会将先导入的函数覆盖
    print(name)  # rock
    introduce()  # my name is rock and age 20
    
  • 解决方法:
    • 使用模块名来区分同名变量或函数:
      import my_info
      import introduce
      print(my_info.name)  # 输出:kyle
      my_info.introduce()  # 输出:My name is kyle
      print(introduce.name)  # 输出:rock
      introduce.introduce()  # 输出:My name is rock and age 20
      
    • 使用 as 关键字为导入的变量或函数指定别名:
      from my_info import name as my_info_name
      from introduce import name as introduce_name
      print(my_info_name)  # 输出:kyle
      print(introduce_name)  # 输出:rock
      

四、Python 中的包

4.1 什么是包

  • 包是一个包含 __init__.py 文件的文件夹(目录)。

  • 包的作用:

    • 避免模块名称冲突。

    • 提供更清晰的模块组织结构。

4.2 示例:包的使用

目录结构:

admin/
    __init__.py
    my_admin.py

文件:admin/__init__.py

print('版权:kyle')
print('Teacher: rock')

文件:admin/my_admin.py

name = 'kyle'

def info():
    print('大家好,my name is kyle and age 18')

导入包中的模块:

import admin.my_admin as a
a.info()  # 输出:大家好,my name is kyle and age 18

使用 from ... import 导入包中的模块:

from admin import my_admin as b
b.info()  # 输出:大家好,my name is kyle and age 18

从包中导入模块中的变量或函数:

from admin.my_admin import name
print(name)  # 输出:kyle

使用通配符 * 导入包中的模块:

from admin.my_admin import *
print(name)  # 输出:kyle
info()  # 输出:大家好,my name is kyle and age 18

4.3 包的嵌套

  • 包可以嵌套,例如 admin 包中可以包含子包 sub_admin

  • 导入子包中的模块可以使用 admin.sub_admin.my_module 的形式。

4.4 包的初始化文件 __init__.py

  • 包的初始化文件 __init__.py 可以用于初始化包,例如定义包级别的变量、函数或类,或者在导入包时自动执行某些代码。

  • 示例:

    # admin/__init__.py
    __author__ = 'kyle'
    __version__ = '1.0'
    

五、主程序运行

5.1 示例:主程序运行

文件:module_a.py

if __name__ == '__main__':
    print('Welcome to Beijing')
    name = 'kyle'
    print(name)

文件:module_b.py

import module_a
# 导入之后运行,不会输出 module_a 中的 print 语句

5.2 if __name__ == '__main__': 的作用

  • 确保某些代码只在直接运行模块文件时执行,而不是在模块被导入时执行。

  • 这在开发可复用的模块时非常有用,可以避免模块中的测试代码或主程序代码在导入时被意外执行。

六、模块的搜索路径

6.1 模块的搜索顺序

当导入模块时,Python 会在以下位置查找模块:

  1. 当前工作目录(即运行脚本所在的目录)。

  2. PYTHONPATH 环境变量中指定的路径。

  3. Python 安装目录中的标准库路径。

  4. 安装的第三方库路径。

6.2 动态添加模块路径

可以通过以下方法让 Python 找到自定义模块:

  • 将模块所在的目录添加到 sys.path 中:
    import sys
    sys.path.append('/path/to/your/module')
    import my_module
    
  • 或者将模块目录添加到 PYTHONPATH 环境变量中。

七、动态导入模块

示例:动态导入模块

import importlib
module_name = 'my_module'
my_module = importlib.import_module(module_name)
my_module.some_function()

八、第三方模块的安装与卸载

# 安装第三方模块的语法:
    pip install 模块名
# 卸载第三方模块的语法:
    pip uninstall 模块名
# 升级pip命令的语法结构:
    python -m pip install -upgrade pip
# 国内下载源
    pip install 模块名 -i http://pypi.douban.com/simple --trusted-host pypi.doubancom

九、总结

  • 模块:一个 .py 文件,用于封装函数、类、变量等,避免名称冲突,提高代码的可维护性和可重用性。

  • :一个包含 __init__.py 文件的目录,用于组织模块,避免模块名称冲突。

  • 导入模块:使用 importfrom ... import,注意解决模块冲突。

  • 主程序运行:使用 if __name__ == '__main__': 确保某些代码只在直接运行模块时执行。

  • 模块搜索路径:了解模块的搜索顺序,必要时动态添加模块路径。

  • 动态导入:使用 importlib 动态导入模块。


posted @ 2025-04-10 21:56  kyle_7Qc  阅读(62)  评论(0)    收藏  举报