一.模块与包

模块是包含Python代码的文件,通常以.py为扩展名。模块可以包含函数、类、变量或可执行代码,用于将相关功能组织在一起,便于代码复用和维护。

模块的作用

  • 代码复用:将常用功能封装为模块,避免重复编写相同代码。
  • 命名空间管理:通过模块划分作用域,避免命名冲突。
  • 项目结构化:通过模块化设计提升项目的可读性和可维护性。

模块的分类

  1. 内置模块:Python标准库提供的模块(如mathos)。
  2. 第三方模块:通过包管理工具(如pip)安装的模块(如numpy)。
  3. 自定义模块:用户自行编写的模块文件。

1.创建模块

在 Python 中,模块是一个包含 Python 代码的 .py 文件。创建一个新文件,命名为 mymodule.py,并在其中编写函数或变量。

# mymodule.py  
def greet(name):  
    return f"Hello, {name}!"  

PI = 3.14159  
 

2.导入模块

全局导入

在其他 Python 文件中,使用 import 语句导入模块并调用其功能

import  模块名  [as  别名]

访问:模块名.成员名

import mymodule  

print(mymodule.greet("Alice"))  
print(mymodule.PI)  
 

局部导入

from  模块名  import   成员名1[as   别名], 成员名2[as   别名]

访问:直接通过成员名的方式访问

说明:指定导入模块的部分成员,只能使用其导入的成员,未导入的成员不能使用;如果多个模块中存在重名成员,后一次导入会覆盖前一次导入。

from mymodule import greet, PI  

print(greet("Bob"))  
print(PI)  
 

from 模块名 import *

导入模块中所有不以单下划线开头的成员,直接通过成员名的方式访问

通过成员名方式直接访问

模块搜索顺序

当导入一个模块时的搜索顺序:

当前目录->PYTHONPATH环境变量中的目录->包含python模块以及这些模块所以来的任何extension module的目录

可以使用以下方式查看模块搜索顺序

import sys
print(sys.path)
 

也可以通过sys.path.append(路径)向sys.path中临时添加路径

Python 的 sys.path 是一个列表,存储了模块的搜索路径。通过 sys.path.append() 可以向其中临时添加自定义路径,使得 Python 解释器能够找到该路径下的模块。

import sys
sys.path.append('/path/to/your/module')
 

添加后,可以直接导入该路径下的模块:

import your_module
 

注意事项

  1. 临时性:通过 sys.path.append() 添加的路径仅在当前运行时生效,程序退出后不会保留。
  2. 路径格式:需使用绝对路径或正确相对路径,确保路径存在且可访问。
  3. 避免重复添加:多次添加同一路径会导致 sys.path冗余,建议先检查路径是否存在:

__all__

在Python模块中,__all__是一个特殊的列表变量,用于定义模块的公共接口。当使用from module import *时,只有__all__中列出的名称会被导入。若未定义__all__,则默认导入所有不以下划线开头的全局名称。

#my_add.py中向__all__添加部分元素
__all__ = ["num","add"] #内容必须要用引号引起来

num = 100
num1 = 200
_str1 = "abc"
def add(a,b):
    return a + b

在main.py中使用from my_add import *导入模块中的内容,没在__all__中的变量在使用时会报错

from my_add import *
print(_str1) #会报错,不可以使用.如果all里面声明了就可以访问
print(num) #100

__name__属性

使用__name__ = "__main__"避免测试代码被执行

注意:

当一个python文件被直接运行时,该文件的__name__属性值为"__main__"

当一个python文件作为模块被导入,__name__属性会被设置为该模块的名称

如果在导入其他模块时候,不需要被导入模块的测试代码被执行,那么可以在被导入模块中作出以下分支判断:

if  __name__ = "__main__"

        执行测试语句

#my_add.py中向__all__添加部分元素
__all__ = ["num","add"] #内容必须要用引号引起来

num = 100
num1 = 200
_str1 = "abc"
def add(a,b):
    return a + b

#测试语句
if  __name__ = "__main__"
    print(add(1,2))
#此时是main.py
import my_add 
"""
导入操作会自动打印my_add.py的最后一个打印语句,输出3
但是我们不想让他执行这个用于测试的语句
我们应该在my_add中使用__name__用来避免这个问题
使用__name__ = "__main__"避免测试代码被执行
"""

3.dir()

dir()是一个内置函数,主要用于列出对象的属性和方法,或者列出当前作用域中定义的名称,并以一个字符串列表的形式返回

当你将一个模块作为dir()的参数时,它返回该模块中定义的名称列表,包括函数、类、变量等等

import math

#查看math模块下的
print(dir(math))

当你将一个对象作为dir()的参数时,他会返回该对象的属性和方法列表

class Example:  
    def __init__(self):  
        self.data = 42  
    def method(self):  
        pass  

obj = Example()  
print(dir(obj))  # 输出包含 'data', 'method', '__class__', '__str__' 等  
 

4.包概述

包是管理python模块命名空间的形式

通过使用.模块名来构造python模块命名空间的一种方式。例如,模块名A.B表示名为A的包中包为B的子模块。通常我们将多个有联系的模块放入一个包中,包和文件夹相似,不过该文件夹下必须有一个__init__.py文件

sound/                  #最高层级的包
    __init__.py         #初始化sound包
    formats/            #用于文件格式转换的包
        __init__.py
        auwrite.py
        aiffread.py

    effects/            #用于音效的包
        __init__.py
        echo.py
        surround.py

5.创建包

__init__.py可以只是一个空文件,也可以执行包的初始化或设置__all__变量。

创建一个graphic文件夹,并且在其中创建circle.py、rectangle.py文件。其中__init__.py文件暂时为空。circle.py和rectangle.py文件写入代码

右键点击项目根目录或目标父目录,选择“New” → “Directory”,输入名称“graphic”并确认。

在“graphic”文件夹上右键,选择“New” → “Python File”,分别输入文件名“circle.py”和“rectangle.py”。创建空文件__init__.py的方式相同,输入文件名时需包含扩展名。

最终目录结构应如下所示:

project_root/
    graphic/
        __init__.py
        circle.py
        rectangle.py
 
    main.py

6.导入包

全局导入import

导入包中模块的所有成员

语法:

import 包名.模块名 [as 别名]

调用方式:包名.模块名.成员名

import graphic.circle

print(graphic.circle.area(10)) #314.15926

注意⚠️:

使用import时,除最后一项外都必须是包。最后一项可以是模块或者包,但不能是类、函数或者变量。

如果最后一项是包,那么必须在被导入包的__init__.py文件中,指定导入包中的哪些模块。这是python导包的一个优化机制,避免导入过多的模块,并且在__init__.py中指定导入模块的时候,建议使用相对路径(from . import circle)。如果是绝对路径,那么他会把导入的模块circle作为顶级模块,直接从sys.path找circle模块,而不是找graphic.circle(import circle

#__init_.py限制包中的哪些模块可以被导入
#from 包名  import  模块
from . import circle

#main.py
import graphic
print(graphic.circle.PI) #此时可以输出

局部导入包下的模块from import

语法: from  包名  import 模块名  [as 别名]

说明:导入包中的某一模块的所有成员

访问:模块名.成员名

from graphic import circle

print(circle.area(10)) #314.159

局部导入包下模块的成员 from import

从包中模块导入功能

语法:from 包名.模块名  import 成员名  [as 别名]

调用方式:成员名

from graphic.circle import area

print(area(10))

局部导入from import*从包中导入模块

当我们使用from import*时,python并不会查找并导入包的所有子模块。唯一解决的方法是提供包的显式索引。如果包的__init__.py中定义了__all__,运行from import*时,他就是被导入的模块名

语法:from 包名  import *

导入包中的某一个模块中不以下划线开始的成员

调用方式:模块名.成员名

在__init__.py下添加如下内容:

__all__ = ["circle"]
注意:如果不加会无法导包

在main.py中使用 from 包名  import *

python的标准库(包)

以下是一些常用的Python标准库及其功能的总结表格:

模块名 功能描述
os 提供与操作系统交互的功能,如文件操作、目录管理等
sys 提供与Python解释器交互的功能,如命令行参数、退出程序等
math 提供数学运算功能,如三角函数、对数、幂运算等
datetime 提供日期和时间处理功能,如日期计算、格式化等
json 提供JSON数据的编码和解码功能
re 提供正则表达式功能,用于字符串匹配和处理
random 提供生成随机数的功能
collections 提供额外的数据结构,如defaultdictCounternamedtuple
itertools 提供高效的迭代器工具,如排列组合、无限迭代器等
functools 提供高阶函数工具,如reducepartial
argparse 提供命令行参数解析功能
logging 提供日志记录功能
subprocess 提供启动和管理子进程的功能
multiprocessing 提供多进程支持
threading 提供多线程支持
socket 提供网络通信功能,支持TCP/UDP协议
urllib 提供URL处理功能,如发送HTTP请求、解析URL等
csv 提供CSV文件读写功能
pickle 提供对象序列化和反序列化功能
hashlib 提供哈希算法功能,如MD5、SHA1等
zipfile 提供ZIP文件压缩和解压功能
sqlite3 提供SQLite数据库操作功能
unittest 提供单元测试框架
time 提供时间相关功能,如休眠、获取时间戳等
glob 提供文件名模式匹配功能
shutil 提供高级文件操作功能,如复制、移动、删除等
tempfile 提供临时文件和目录管理功能

这些标准库覆盖了Python开发中的常见需求,包括文件操作、数据处理、网络通信、并发编程等。

7.引入第三方库

当使用python中没有内置的库时,可以通过以下方式安装第三方库

pip命令方式

pip是python包管理工具,该工具提供了对python包的查找、下载、安装、卸载的功能。pip默认的源是python package index,其地址为https://pypi.org/simple/,如果下载比较慢还可以指定其他源

pip常用命令

查看我们已经安装的软件包:pip list

安装软件包,具体包名可以到pypi上查找:pip install 包名

卸载软件包:pip uninstall 包名

临时使用其他源:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名

8.打包自己的库并安装

先安装setuptools库

使用命令:pip install setuptools

在包外创建一个setup.py文件

setup.py中添加如下内容:

在setup.py同级目录下进行构建

也可以生成压缩包

python setup.py sdist

pip命令安装自己打的库

pip install path_to_your_package/distribution/your_package_name-0.1.tar.gz(自己的库的地址)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐