23_python基础—模块和包

简介: 23_python基础—模块和包

一、模块


模块是 Python 程序架构的一个核心概念


每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块

模块名 同样也是一个 标识符,需要符合标识符的命名规则

在模块中定义的 全局变量 、函数、类 都是提供给外界直接使用的 工具

模块 就好比是 工具包,要想使用这个工具包中的工具,就需要先 导入 这个模块


1.1. 导入模块


1.1.1 导入模块的方式


import 模块名


from 模块名 import 功能名


from 模块名 import *


import 模块名 as 别名


from 模块名 import 功能名 as 别名


导入之后


通过 模块名. 使用 模块提供的工具 —— 全局变量、函数、类


1.1.2 导入方式详解


1.1.2.1 import (导入全部功能)


  • 语法


# 1. 导入模块
import 模块名
import 模块名1, 模块名2...
# 2. 调用功能
模块名.功能名()


  • 示例


import math
print(math.sqrt(9))  # 3.0


1.1.2.2 from…import… (导入部分功能)


  • 语法


# 从 模块 导入 某一个工具
from 模块名 import 功能1, 功能2, 功能3...


  • 导入之后


  • 不需要 通过 模块名.
  • 可以直接使用 模块提供的工具 —— 全局变量函数


  • 示例


from math import sqrt
print(sqrt(9))    # 3.0


1.1.2.3 from … import *


  • 语法


# 从 模块 导入 所有工具
from 模块名 import *


这种方式不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查


  • 示例


from math import *
print(sqrt(9))    # 3.0


1.1.2.4 as定义别名


  • 语法


# 模块定义别名
import 模块名 as 别名
# 功能定义别名
from 模块名 import 功能 as 别名


  • 示例


# 模块别名
import time as tt
tt.sleep(2)
print('hello')
# 功能别名
from time import sleep as sl
sl(2)
print('hello')


1.2. 制作模块


  • 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。
  • 也就是说自定义模块名必须要符合标识符命名规则。


1.2.1 定义模块


新建一个Python文件,命名为my_module1.py,并定义testA函数。


def testA(a, b):
    print(a + b)


1.2.2 测试模块(__name__)


在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息.,例如,在my_module1.py文件中添加测试代码。


def testA(a, b):
    print(a + b)
# 测试信息
testA(1, 1)


此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行testA函数的调用。


解决办法如下

def testA(a, b):
    print(a + b)
# 只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行testA函数调用
if __name__ == '__main__':
    testA(1, 1)


  • __name__是系统变量,是模块的标识符,是Python的一个内置属性,记录着一个字符串。它的值分为两种情况:


  • 如果 是被其他文件导入的,__name__ 就是 模块名
  • 如果 是当前执行的程序 __name__ 是 __main__.


1.2.3 调用模块


import my_module1
my_module1.testA(1, 1)


1.2.4 注意事项


如果使用from .. import ..from .. import *导入多个模块的时候,且模块内有同名功能。当调用这个同名功能的时候,调用到的是后面导入的模块的功能。


  • 示例
# 模块1代码
def my_test(a, b):
    print(a + b)
# 模块2代码
def my_test(a, b):
    print(a - b)
# 导入模块和调用功能代码
from my_module1 import my_test
from my_module2 import my_test
# my_test函数是模块2中的函数
my_test(1, 1)


1.3. 模块定位顺序


当导入一个模块,Python解析器对模块位置的搜索顺序是:


当前目录


如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。

如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/

模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。


注意


自己的文件名不要和已有模块名重复,否则导致模块功能无法使用

使用from 模块名 import 功能的时候,如果功能名字重复,调用到的是最后定义或导入的功能。


# 拓展: 名字重复
# 问题:import 模块名  是否担心 功能名字重复的问题  -- 不需要
import time
print(time)
time = 1
print(time)
# 问题:为什么变量也能覆盖模块? -- 在Python语言中,数据是通过 引用 传递的。


<module ‘time’ (built-in)>

1

1.4. __all__


如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素。


  • my_module1模块代码
# 定义多个功能,把某个功能添加到__all__
__all__ = ['testA']
def testA():
    print('testA')
def testB():
    print('testB')


  • 导入模块的文件代码


from my_module1 import *
testA()
# 因为testB函数没有添加到all列表,只有all列表里面的功能才能导入
testB()


testA


NameError: name ‘testB’ is not defined


二、包(Package)


2.1 概念


包:将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包。


包 是一个 包含多个有联系的模块组织在一起 的 特殊目录(文件夹)

目录下有一个 特殊的文件 __init__.py

包名的 命名方式 和变量名一致,小写字母 + _

好处


使用 import 包名 可以一次性导入 包 中 所有的模块


2.2 制作包


[New] — [Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。


注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为。


示例


新建包mypackage

新建包内模块:my_module1 和 my_module2


  1. 模块内代码如下


# my_module1
print(1)
def info_print1():
    print('my_module1')


# my_module2
print(2)
def info_print2():
    print('my_module2')


2.3 导入包


2.3.1 方法一


# 导入
import 包名.模块名
# 调用功能
包名.模块名.功能名()


  • 示例


import my_package.my_module1
my_package.my_module1.info_print1()


2.3.2 方法二


注意:必须在__init__.py文件中添加__all__ = [],控制允许导入的模块列表。


from 包名 import *
模块名.功能名()


  • 示例
from my_package import *
my_module1.info_print1()


三、发布模块(知道)


  • 如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作


3.1 制作发布压缩包步骤


1) 创建 setup.py


  • setup.py 的文件
from distutils.core import setup
# 多值字典参数,每一个参数之间用逗号分隔
setup(name="hm_message",  # 包名
      version="1.0",  # 版本
      description="itheima's 发送和接收消息模块",  # 描述信息
      long_description="完整的发送和接收消息模块",  # 完整描述信息
      author="LiYang",  # 作者
      author_email="123@163.com",  # 作者邮箱
      url="www.qq.com",  # 主页
      py_modules=["hm_message.send_message",
                  "hm_message.receive_message"])   # 包中,包含的模块;把包中包含的模块全部写上去


有关字典参数的详细信息,可以参阅官方网站:


https://docs.python.org/2/distutils/apiref.html


2) 构建模块


  • 进入到发布模块这个目录,在终端中执行下面命令


$ python3 setup.py build


3) 生成发布压缩包


  • 进入到发布模块这个目录,在终端中执行下面命令


$ python3 setup.py sdist


注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!


3.2 安装模块


$ tar -zxvf hm_message-1.0.tar.gz   # 解压缩(拿到的压缩包)
$ sudo python3 setup.py install     # 在解压下的文件中进行


3.3 卸载模块


直接从安装目录下,把安装模块的 目录 删除就可以


$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*


3.4 pip 安装第三方模块


第三方模块 通常是指由 知名的第三方团队 开发的 并且被 程序员广泛使用 的 Python 包 / 模块


例如 pygame 就是一套非常成熟的 游戏开发模块

pip 是一个现代的,通用的 Python 包管理工具


提供了对 Python 包的查找、下载、安装、卸载等功能


安装和卸载命令如下:

# 将模块安装到 Python 2.x 环境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 将模块安装到 Python 3.x 环境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame

1)在 Mac 下安装 iPython


$ sudo pip install ipython


2)在 Linux 下安装 iPython


$ sudo apt install ipython
$ sudo apt install ipython3


四、总结


  • 导入模块方法


import 模块名
from 模块名 import 功能名
from 模块名 import *


  • 导入包


import 包名.模块名
from 包名 import *


  • __all__ = [] :允许导入的模块或功能列表
目录
相关文章
|
1月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
47 4
|
10天前
|
Python
Python Internet 模块
Python Internet 模块。
105 74
|
28天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
105 63
|
1月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
1月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
22天前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
28 5
|
1月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
40 5
|
1月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
37 0
|
1月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
25 0