Python模块与包

一、模块的简介

1.什么是模块

模块就是一系列功能的集合,模块中就是提前写好了很多的功能,可以直接拿来用。

2.模块的本质

内部具有一定的功能(代码)的py文件,文件可以包含函数、变量和类等,也可以包含可执行代码

3.为什么要用模块

使用模块可以让我们将代码分成不同的文件,以及复用已有的代码。在一个模块中定义的内容可以被同一个文件夹下的其他模块使用,也可以被其他文件夹下的模块使用。模块可以使我们更好地组织代码,使代码的可读性和可维护性更高。
也可以把别人写好的一些功能下载下来,直接用到自己的项目中,让开发效率大大提高,相当于站在巨人的肩膀上

二、模块的分类

	'模块的分类'
	1.内置模块
		 内置模块就是Python解释器自带的可以直接调用的模块
		 eg:import time
		 	 time.sleep(3)  让所在位置的代码块睡眠三秒后运行
	2.自定义模块
		自定义模块就是自己写出来的模块
			eg:登录功能、注册功能等
	3.第三方模块
		第三方模块就是由Python爱好者(大佬)分享到网络上,直接copy下来使用的

三、模块的表现形式

	'表现形式'
	1.py文件(py文件也可以称之为是模块文件)
	2.含有多个py文件的文件夹()按照模块功能的不同划分不同的文件夹存储
	3.已被编译为共享库或DLL的c或C++拓展(了解)
	4.使用C编写并链接到Python解释器的内置模块(了解)

四、导入模块的两种句式

	1.import句式
	'以import fenp为例研究底层原理'
	import fenp #导入模块
	print(fenp.count) # 通过模块名加句点符号拿到了fenp文件中的变量名
	print(fenp.demo())
	fenp.ZeroT() # 通过模块名加句点符号拿到了fenp文件中的函数调用
	
	'''
	# 1.先产生执行文件的名称空间
	# 2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
	# 3.在执行文件的名称空间中产生一个模块的名字
	# 4.在执行文件中使用该模块名加句点符号的方式使用模块名名称空间中所有的名字
	'''

	2.from....import句式
	'以form fenp import demo,count为例研究底层原理'
	from fenp import demo,count  # 知名道姓的方式导入

	demo()  # 可以不用句点符号即可执行
	print(count)
	# ZeroT() # 为在导入时写入,直接在执行文件中执行会报错,不存在
	
	count = 1000 
	print(count)
	'''
	# 1.先产生执行文件的名称空间
	# 2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
	# 3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
	# 4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
	
	注意:在form....import句式情况,执行文件中出现了名字冲突的情况
	出现冲突的时候距离谁近就用谁
	'''
	以上两种方式,导入文件多次,也只会执行一次导入文件中的代码,
	所以只需要导入一次即可

import句式的代码
在这里插入图片描述
import句式运行打印效果
在这里插入图片描述
form…import句式的代码
在这里插入图片描述
from…import句式的运行打印效果
在这里插入图片描述

五、两种格式的优缺点

	'''
	import与from...import两者的优缺点
	
	import句式
	    优点:由于使用模块名称空间中的名字都需要模块名加句点符号的方式才能用
	        所以不会轻易的被执行文件中的名字替换掉
	    缺点:每次使用模块名称空间中的名字都必须要使用模块名加句点符号的方式才能用
	    
	form...import句式
	    优点:指名道姓的导入模块名称空间中需要使用的名字,不需要模块名加句点符号
	    缺点:容易和执行文件中名字冲突(绑定关系被修改)
	'''

六、导入模块补充知识

	1.起别名
		1.当导入模块名字冲突时候
		'通过 后面加上as和新的名称即可直接句点符号调用'
		import fenp as test
		print(test.count)  # 999
		
		'通过后面加上as和新的名称即可直接调用'
		from fenp import demo as zero1
		zero1() # hello demo
		
		2.原有模块文件名太长复杂可读性不强
		'通过 后面加上as和新的名称即可直接句点符号调用'
		import vkjsaldkjflkda as vl


	2.多模块导入
		1.方式一(一个个分开导入)
			import vl
			import na
			import ks
			import al
		'如果多模块的功能相似度不高 就推荐这种一个一个导入'
		
		2.方式二()
			import vl,na,ks,al
			'多模块导入一个中,建议功能相同才能导入'
		
	3.通用导入
		需要使用模块名称空间中很多名字,并且只能使用from....import句式
		for demo import *  # '*'表示所有名字
		ps:针对*号的导入还可以控制名字的数量
		在模块文件中可以使用__all__ = [字符串的名字]控制*能够获取的名字
			控制名称仅限制*号全部的模式下使用

七、循环导入

	'''
	1.如何理解循环导入
	    两个文件之间彼此导入彼此并且使用相互各自名称空间中的名字
	    
	2.如何解决循环导入的问题
	    1.确保名字在使用之前就已经准备完毕了
	    2.我们以后再编写代码的过程中应该即可能避免出现循环导入
	'''

在这里插入图片描述

八、判断文件类型(执行文件、导入文件)

	print(__name__) # __main__
	import fenp
	print(__name__) # fenp
	'''
	所有的py文件都可以打印__name__对应的值
		当py文件是执行文件的时候__name__对应的值是__main__
		当py文件时被导入文件的时候__name__对应的值是模块名
	'''
	if __name__ = '__main__':
		print('执行文件 运行的代码')
	'''
	#加入这个判断就意味着,这里的代码必须是文件当成执行文件的时候才会执行
	如果该文件被导入了,这里的代码不会执行
	'''

在这里插入图片描述
在这里插入图片描述

九、名字的查找顺序

查找顺序:内存中>>>>内置模块中>>>>环境变量sys.path中。

	名字的查找顺序:
	'''
	1.先从内存中查找
	2.再从内置模块中查找
	3.最后去环境变量sys.path中查找

	如果以上都找不到,那么就会直接报错!
	'''
	1.先导入一个文件 然后再运行程序过程中删除导入文件 发现还可以使用
		import test		导入文件
		import time		导入时间模块

		time.sleep(10)	睡眠10秒后运行
		print(test.count)	打印导入文件的count变量值

'''最后测试得到的结果就是,在这个删除过程中,文件删除了,但是结果没有报错,但是如果在运行一次就会报错'''

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	2.创建一个跟内置模块名相同的文件名
	import time		导入和内置模块一样的名字
	print(time) 	打印看一下time看看是什么结果为:<module 'time' (built-in)>
	print(time.number)	在打印一下导入文件中的变量值看一下

	'''得出的结果是,如果命名跟原本的内置的模块一样则最终结果会报错 所以要禁忌用内置模块相同的名字'''

在这里插入图片描述
在这里插入图片描述

	3.导入模块的时候,一定要知道那个是执行文件,所有的路径都是参照执行文件来的
	当我们导入文件和执行文件不在同一层级时,我们就可以使用添加路径的方式来寻找
	import sys
	sys.path.append(r'E:\Pycharm Project Test\find\aaa')
	import md
	print(md.number)

	导入不在同一层级的时候也可以用from....import句式来
	from aaa import md
	print(md.number)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十、相对导入和绝对导入

我们都知道绝对路径和相对路径,现在我们想要了解的是相对导入和绝对导入。
其实概念和路径的一样的。绝对是指定到某一个具体的文件,而相对是指定到某一个区域文件夹

补充知识:只要涉及到模块的导入 那么系统路径sys.path永远以执行文件为准
.(句点符号)在路径中表示当前目录 ..(两个句点符号)在路径中表示上一层目录 ..\..在路径中表示上上层目录

	'''再次强调的一点:一定要分清楚谁是执行文件!!!模块的导入全部是以执行文件为准'''
	绝对导入
		绝对导入就是我们说的指定到特定的文件
		from aaa import md		可以精确到模块名
		from aaa.bbb.ccc.md import name		也可以精确到模块中的变量名
	'''
	其实就是以执行文件所在的sys.path为起始路径,往下一层层的找
	如果有文件不在同一层级的文件路径,想要用就可以直接把绝对路径添加到执行文件sys.path环境变量中即可
	'''

	相对导入
		相对导入就是给到路径文件夹,然后在此文件夹中寻找文件
		from . import md	在当前目录
		from .. import md	在上一层目录
		from ..\.. import md  在上上层目录
	'''
	相对导入不在依据执行文件所在的sys.path 而是模块文件自身路径为准
	相对导入只能在模块文件中使用 不能再执行文件中使用
	相对导入在项目比较复杂的情况下 可能会出错所以推荐使用绝对导入 少用相对导入
	'''

十一、包的使用

1.什么是包?

就是文件夹,其实就是文件夹中包含了一系列的py文件(模块)
包就是一系列模块的组合

2.包和模块有什么区别呢?

包内部有一个特殊文件:‘_ init _’.py文件,而这个文件就是包的核心

	包的作用:
		它可以帮我们存放多个py文件(模块文件) 也仅仅是为了更加方便的管理模块文件

	具体使用
	'虽然Python3对包的要求降低了,不需要__init__.py也可以识别,但是为了兼容性考虑最好还是加上__init__.py'
	1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
		from bin import test,md
	2.如果直接导入包名
		import 包名
		导入包名其实就是导入包名下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字
		
		import 包名
		注意导入包名主要看__init__.py文件 就相当于这个文件夹的父文件夹
		这个文件里面有什么文件你才能用什么文件 导入包里面其他模块文件,执行文件会直接报错
		其实也可以跨过__init__.py直接导入包里面的模块文件 那就是直接指名道姓的导入包里面的模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十二、编程思想的转变

	1.面条版阶段
	所有的代码全部堆叠在一起
	2.函数版阶段
		根据功能的不同封装不同的函数
	3.模块版阶段
		根据功能的不同拆分成不同的py文件
	"""
	第一个阶段可以看成是直接将所有的数据放在C盘
		视频 音频 文本 图片
	第二个阶段可以看成是将C盘下的数据分类管理
		视频文件夹 音频文件夹 文本文件夹 图片文件夹
	第三个阶段可以看成是将C盘下的数据根据功能的不同划分到更合适的位置
		系统文件夹 C盘	
		视频文件夹 D盘
		图片文件夹 E盘
	ps:类似于开公司(小作坊 小公司 上市公司)
		为了资源的高效管理
"""

十二、软件开发目录规范

	针对上述的第三个阶段	分模块文件多了之后还需要有文件夹
	我们所使用的所有的程序目录都有一定的规范
	
	'''
	软件开发目录规范就是给文件夹起合适的名字
	1.文件及目录的名字可以变换 但是思想不变的 分类管理
	2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
	'''
	
	myproject项目文件夹
	1.bin文件夹
		主要用于储存项目启动文件	
		start.py 启动文件可以放在bin目录下,也可以直接在项目根目录
	2.conf文件夹
		主要存储项目配置文件 	
		setting.py	里面存放项目的默认配置 一般都是全大写
	3.core文件夹
		主要存储项目核心文件
		src.py	里面存放项目核心功能
	4.lib文件夹
		主要存储项目公共功能	common.py
	5.db文件夹
		主要存储项目相关数据
		userinfo.txt 存放数据库操作相关的代码
	6.log文件夹
		主要存储项目日志文件	log.log
	7.interface文件夹
		主要存储项目接口文件	
		user.py account.py	根据具体业务逻辑划分对应的文件
	8.readme文件(文本文件)
		主要存储项目相关说明	  编写的程序的说明、介绍、类似产品说明书
	9.requirements.txt文件
		主要存储项目所需模块及版本
	
	'''
	datebase文件夹后面讲到项目就会被数据库软件代替掉
	log文件后面讲到项目也会被专门的日志服务代替掉
	'''
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值