【2022-07-13】Python模块详解

python模块

模块简介

  • 模块就是用一堆代码实现一些功能的代码的集合,通常一个或多个函数写在一个.py文件里,如果实现的功能过于复杂,那么就需要创建n个.py文件

    这n个.py文件的集合就是模块。

  • 通俗的讲,我们也可以把模块当成是一个工具包,要想使用这个工具包里面的工具,就需要导入这个模块。

模块的分类

  • Python中的模块可分为三类,分别是内置模块、第三方模块和自定义模块,相关介绍如下:

    内置模块:

    ​ Python内置标准库中的模块,也是Python的官方模块,可直接导入程序供开发人员使用

    第三方模块:

    ​ 由非官方制作发布的、供给大众使用的Python模块,在使用之前需要开发人员先自行安装

    自定义模块:

    ​ 开发人员在程序编写的过程中自行编写的、存放功能性代码的.py文件

模块的表现形式

  • py文件(py文件也可以称之为是模块文件)
  • 含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
  • 已被编译为共享库或DLL的c或C++扩展
  • 使用C编写并链接到python解释器的内置模块

导入模块语句 ------import语句

import module      # 1.导入module.py文件并且执行     打印结果:my name is module
# print(module.age)  # 18
# print(module.test1())  # from module.py test1 function

"""
上述执行流程如下:
1.先运行01 import module way.py文件后,会立刻产生这个py文件的全局名称空间
2.import module即导入module.py文件,并自动执行module.py文件,产生该文件的全局名称空间
3.执行module.py文件中所有的代码,并将产生的名字存储到该名称空间中
4.当前名称空间中产生module,module指向的是module.py模块名称空间
5.使用module点名字,就相当于和module.py名称空间索要名字
"""

# age = 25
# print(module.age)    # my name is module 18
# print(age)           # 25


# def test1():
#     print('我是来自执行文件内的test1函数')  # from module.py test2 function


# module.test2()                     	   # from module.py test1 function  18

# age = 28
# module.change()
# print(age)                     # 28
# print(module.age)              # 23


补充说明

同一个程序反复导入相同的模块,导入语句只会执行一次

import module     执行有效
import module	  执行无效
import module	  执行无效

导入模块语句-----from.....import.....语句

from module import age          # 从module.py文件中只取出age,其余暂不需要
print(age)                      # 18

"""
上述语句执行流程如下:
1.首先运行01 import module way.py文件后,会立刻产生这个py文件的全局名称空间
2.运行from module import age代码后,立刻产生module.py的全局名称空间
3.开始执行module.py文件中的代码
4.此时执行文件的名称空间里只存放了age,并且指向了module.py文件中的age指向的值18
"""


# from module import age, test1
# test1()                           # from module.py test1 function

两种执行语句的优缺点

import module
	优点:通过md点的方式可以使用到模块内所有的名字 并且不会冲突
	缺点:md什么都可以点 有时候并不想让所有的名字都能被使用
from module import age, test1
	优点:指名道姓的使用指定的名字 并且不需要加模块名前缀
	缺点:名字及其容易产生冲突(绑定关系被修改)

循环导入问题

  • 循环导入产生的问题

    ​ 两个模块直接相互导入,且相互使用其名称空间中的名字,但是有些名字没有产生就使用,就出现了循环导入问题

  • 解决问题

    ​ 延后导入,先产生对方要使用的名字,再去完成导入对方

import y                               	import x
name = 'from x.py'					   name = 'from y.py'
print(y.name)                            print(x.name)



"""
上述语句执行流程如下:
1.首先运行x.py文件,随即产生了x.py的全局名称空间
2.执行import y语句,随即产生了y.py文件的全局名称空间
3.然后执行y.py文件中的代码,即import x
4.名称空间已创建,并在x.py文件的空间里定义了一个name
5.此时print(y.name)是不可行的,name并没有产生,因为遇到了import x 于是陷入了一个循环
"""


from导入马上会使用名字,极容易出现错误,建议循环导入情况下,使用import导入

先提前产生名字,在导入模块(先做饭,再出门)

在导入逻辑放在函数中,将导入的逻辑延后到函数的调用,只要调用在产生名字后即可

"""循环导入将来尽量避免出现!!! 如果真的避免不了 就想办法让所有的名字在使用之前提前准备好"""


判断文件类型

因为一个python文件,可以是执行文件,也可以是被导入文件,那么我们该如何来区分呢?python中通过__name__的内容来进行区分。

​ 注意:

​ 如果在执行文件中,name__的值是__main,并且是字符串类型。

​ 如果作为模块时,__name__的值被赋予模块名。

作为模块的开发者,可以在文件末尾基于__name__在不同应用场景下的值的不同来控制文件执行不同的逻辑。

if __name__ == '__main__':
    test.py被当做脚本执行时运行的代码
else:
    test.py被当做模块导入时运行的代码

模块的查找顺序

  • 模块的查找顺序:内存空间>>>内置模块>>>sys.path查找(类似于我们之前学过的环境变量)。如果这三个地方都没找到,会直接报错

  • 导入模块的时候一定要清楚哪一个是执行文件,因为所有的路径都是参照文件来的

内存空间查找

import module
import time

time.sleep(7)              # 程序在睡眠期间被删除
print(module.age)          # 18

"""
执行删除操作前,文件已经写进了内存里,所以还能看到打印的结果,如果在执行一次就会直接报错
"""

内置模块查找

import time
print(time)                    # <module 'time' (built-in)>  打印的结果是内置time
print(time.time())             # 1657711015.7224374          获取时间戳


"""
创建py文件时,一定不要和模块名关键字(内置、第三方)发生冲突
"""

sys.path查找

import sys
print(sys.path)

"""
['D:\\python\\study\\day17', 
'D:\\python\\study\\day17', 
'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 
'D:\\python38\\python38.zip', 
'D:\\python38\\DLLs',
'D:\\python38\\lib', 
'D:\\python38', 
'D:\\python38\\lib\\site-packages', 
'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']

"""

"""
上述打印的结果是个列表,里面存放了很多路径,我们只需要从第一个路径中去查找就可以了,第一个其实就是执行文件所在的路径
"""

解决方法

方法一:

import sys
sys.path.append(r'D:\python\study\day17\xxx')

from xxx import time

print(time.name)

"""
sys.path是一个列表,所有我们可以使用append方法进行追加     
之后把目标文件所在的路径添加到sys.path路径中就可以了
"""



方法二:

from xxx import time
print(time.name)


"""
使用from...import...句式指名道姓的查找
"""
posted @   dy12138  阅读(297)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示