模块与包

【一】模块

模块(Module)是指包含了一组相关功能的代码集合,可以通过导入(import)的方式在其他程序中重复使用。

在Python中,一个模块可以是一个包含了函数、类、变量和语句的.py文件。模块提供了一种组织和重用代码的方式,使得代码的编写、维护和理解都变得更加简单和高效。

通过将相关的代码组织在模块中,我们可以将代码按照功能进行划分,使得每个模块都具有特定的目的和责任。模块可以被其他程序导入,并通过调用其中的函数、使用其中的类或访问其中的变量来实现代码的重用。

Python标准库提供了大量的模块,涵盖了各种常见的任务和功能,例如文件操作、网络通信、数据处理、数学计算等。此外,还有许多第三方库和框架也提供了自己的模块,可以扩展Python的功能。

1.1 导入方式

1.1.1 impor直接导入

# 导入math模块
# 可以导入多个模块用逗号分割
# import math,os
import math
# 使用math模块中的函数和常量
print(math.sqrt(16))  # 计算平方根
print(math.pi)       # 输出圆周率

# 导入模块中的特定函数或类
from math import sin, cos

# 使用导入的函数
print(sin(0.5))  # 计算正弦值
print(cos(0.5))  # 计算余弦值

在上述示例中,我们首先使用import语句导入了math模块,然后使用math.sqrt()math.pi来调用该模块中的函数和常量。

1.1.2 from + import

调用文件内容
from func.get_user_info import main

main()
调用文件内容
def get_user_info(info):  
    def inner(*args, **kwargs):  
        global username_user_input, password_user_input  
        username_user_input = input('请输入用户名').strip()  
        password_user_input = input('请输入密码').strip()  
        return info(*args, **kwargs, username_input=username_user_input, password_input=password_user_input)  
  
    return inner  
  
  
@get_user_info  
def main(*args, **kwargs):  
    ...  
    return username_user_input, password_user_input

1.1.3 导入后起别名

from func.get_user_info import main as zhu

zhu()

1.2 导入文件后执行的操作

当在Python中使用import语句导入文件时,会执行以下操作:

  1. 导入模块:Python解释器会查找指定的模块文件,并将其加载到内存中。如果模块已经被加载过,它将被直接引用,否则将执行下面的步骤。

  2. 编译模块:Python解释器会将模块文件编译成字节码形式,以便后续执行。

  3. 创建模块的命名空间:一个模块在导入时会创建一个独立的命名空间,用于存储模块中定义的函数、变量和类等。

  4. 执行模块代码:Python解释器会按顺序执行模块中的代码。这意味着模块中的顶层语句(不在任何函数或类定义内部的语句)将被执行。

    • 变量定义和赋值语句将创建并初始化相应的变量。
    • 函数定义语句将创建函数对象并将其绑定到相应的名称。
    • 类定义语句将创建类对象并将其绑定到相应的名称。
  5. 返回模块对象:导入完成后,import语句将返回表示已导入模块的模块对象。可以使用该对象来访问模块中定义的函数、变量和类。

1.3 循环导入问题

循环导入指的是在模块之间相互导入形成循环依赖的情况。当两个或多个模块相互导入时,如果导入路径形成循环,就会导致循环导入的错误。

例如,假设有两个模块A和B,模块A导入了模块B,同时模块B也导入了模块A。当任何一个模块被导入时,Python解释器会尝试导入所需的依赖模块。在这种情况下,导入模块A时会触发导入模块B,而导入模块B时又会触发导入模块A,从而形成了循环依赖。

循环导入可能会导致程序出现以下问题:

  • NameError:由于模块在导入过程中还未完全加载,因此无法访问对方模块中的名称。
  • 逻辑错误:循环导入可能导致代码执行顺序混乱,使得预期的行为无法实现。

【二】包

包(Package)是一种组织和管理Python模块的方式。它是一个包含多个模块的目录,目录下通常会包含一个特殊的文件__init__.py,用于标识该目录为一个包。

通过使用包,可以将相关的模块组织在一起,形成一个更大的功能单元。包的主要目的是为了提供一种更好的模块管理方式,使得模块的组织结构更清晰、易于维护和重用。

包可以创建多层次的结构,用于更好地组织和管理模块。可以在包中导入其他模块和子包,并通过点号.进行层级访问。

例如,假设我们有一个名为my_package的包,它包含以下文件和目录:

my_package/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        module3.py

2.1 包的导入方式

# 导入包
import my_package.module1
# 导入my_package包中subpackage模块的module3
from my_package.subpackage import module3
posted @ 2023-12-14 21:28  Unlucky  阅读(32)  评论(0)    收藏  举报