系列文章目录
?一、模块
二、包
一、模块
1.1? ?模块的概念
模块是Python程序框架的一个核心概念
·每一个扩展名 py 结尾的Python源代码文件都是一个模块
·模块名同样也是一个标识符,需要符合标识符的命名规则
·在模块中定义的全局变量、函数、类 都是提供给外界直接使用的工具
·模块就好比工具包,要想使用这个工具包的工具,需要用import 导入这个模块
1.2? ?模块的两种导入方式
1) import导入
???(注:在导入时,每隔导入应该独占一行)
导入之后,通过 ?模块名. 的方式使用模块提供的工具——全局变量、函数、类
下面是练习:
首先准备两个测试模块
模块一:

?模块二:

?再用 import 导入:

?
?
扩展:import导入
如果摸一个模块的名字太长,或者非常不好识别,可以使用 as 指定模块的别名
语法:
import 模块名1 as 模块别名
(注意:模块别名要符合大驼峰命名法)

这个为了我们编写代码的时候自己方便?
2)from..import 导入
·如果希望从某一个模块中,导入部分工具,就可以使用 from...import
·import 模块名 是一次性把木块中虽有的工具全部导入,并且通过模块名/别名访问
·导入之后,不需要通过 模块名. ?可以直接使用模块提供的工具——全局变量、函数、类

?注:(from...import 导入方式,可以直接使用工具,不需要像之前import 导入那样,使用模块名. 的方式)
下面是使用 from...import导入时,需要注意的事项:
注(如果两个模块存在同名的函数,那么 后导入的函数,会覆盖先导入的函数,所以在开发时 import 代码应该统一写在代码顶部,这样更容易我们第一时间发现冲突,一旦发现冲突,可以时使用 as 关键字 给其中一个工具名起一个别名)

?注意看,pycharm会智能把模块二 高亮,就是提醒会执行模块二
下面是起了别名的操作:

?这样就可以避免冲突
补充知识点: from...import* (这个只需要了解,不推荐,因为函数名重名,并没有任何提示,出现问题不好排查,只能平时私底下做一下就行)
下面是正常的导入:

?输出结果:

在没有出现重名的情况下,还是非常实用的
?下面是有重名的情况:

因为之前模块一和模块二的 全局变量title 和 函数say hello 都是重名的,所以下面的输出结果自动就输出了模块二的,并且没有扔个提示,在平时开发中,就很难排查,所以不推荐在公司开发使用,自己平时私底下偷懒可以用一下
1.3? ? 模块的搜索顺序(扩展)
Python 的解释器 在导入模块时会:
- 搜索当前目录指定模块名的文件,如果有就直接导入
- 如果没有,在搜索系统目录
??·在开发时,给文件起名,不要和系统的模块文件名重名
Python 中每一个模块都有一个内置属性 __file__可以查看模块的 完整路径
示例:
import random
#生成一个0-10的数字
rand = random.randint(0, 10)
print(rand)
注意:如果当前目录下,存在一个 random.py 的文件,程序会无法正常执行
·这个时候Python的解释器会加载当前目录下的 random.py 而不会加载系统的 random模块

?因为我们在里面建立了一个 random.py 的空白文件,Python的解释器会优先加载当前目录下的空白 random.py,而不会去加载原本系统的,因为我们创建的只是一个没有任何作用空白的文件,所以系统就会报错
下面可以用 __file__ ?再进一步验证:

?系统会输出当前我们加载的 random 模块保存的位置,然后点击删除就可以了正常运行了

?删除之后:

解释器会告诉我们新的random 是Python系统的
下面程序就可以正常运行了:

?代码:
import random
print(random.__file__)
rand = random.randint(0, 10)
print(rand)
小结:平时给文件起名时,千万切记不要和系统的模块文件 重名
1.4? ?开发原则——每一个文件都应该是可以被导入的
·一个独立的Python 文件就是一个模块
·导入问价时,文件中所有没有任何缩进的代码,都会被执行一遍
实际开发场景
·在实际开发中,每一个模块都是独立开发的,大多都有专人负责
·开发人员 通常会在模块下方 增加一些测试代码
??仅在模块内使用,而被导入到其他文件中不需要执行
__name__属性
·__name__属性可以做到,测试模块的代码 只在测试情况下被执行,而在被导入时不会被执行
·__name__ 是 Python 的一个内置属性,记录这一个字符串
·如果 是被其他文件导入的,__name__ 就是模块名
·如果 是当前执行的程序__name__ 是__main__
下面是练习:
先创建一个模块:

?代码:
# 全局变量、函数、类,注意:直接执行的代码不是向外界提供的工具!!!
def say_hello():
print("你好")
#如果直接执行模块
print(__name__)
# 问价导入时,能够直接执行的代码是不需要在导入模块中被执行的
print("小明开发的模块")
say_hello()
输出结果:

?如果直接在当前程序执行 __name__ ?下面输出的结果永远都是__main__
下面是导入模块:

?输出结果:

?输出的直接是模块的名称,而不是__main__
下面是具体的操作:

?要增加一个__name__ == __main__的判断
代码:
# 全局变量、函数、类,注意:直接执行的代码不是向外界提供的工具!!!
def say_hello():
print("你好")
#如果直接执行模块,__main__
if __name__ == "__main__":
print(__name__)
# 问价导入时,能够直接执行的代码是不需要在导入模块中被执行的
print("小明开发的模块")
say_hello()
在导入模块输出的结果:

?总结:如果我们需要测试模块,就增加一个条件判断,在条件下方针对模块进行测试,这样在开发模块时能够顺利的对模块进行测试,而且测试的内容,被其他人导入后,不会被执行,不会影响后续代码拼接过后的运行结果
二、包(package)
概念
·包是一个包含多个模块的特殊目录
·目录下有一个特殊的文件 __init__.py
·包名的命名方式和变量名一致,小写字母+ 下划线 _
优点
·使用 import 包名 可以一次性导入包中所有模块
案例演练:
- 新建一个 pl_massage 的包
- 在目录下,新建两个文件 send_massage 和 receive_massage
- 在 send_massage 文件中定义一个 send 函数
- 在 receive_massage 文件中 定义一个 receive 函数
- 在外部直接导入pl_massage 的包
__init__.py
·要在外界使用包中的模块,需要在__init__.py 中指定 对外界提供的模块列表
下面是建立包:

取好名字即可
创建好包之后,pycharm 会自动创建一个 __init__.py 的文件

?下面是在包中,建立2.两个文件 send_massage 和 receive_massage

?然后是封装好两个函数

?
?
下面是重点:一定要先在__init__.py 这个特殊文件中,把外界需要使用的模块,通过下面的使用 from . import 的语法,逐一导入

接下来就是在之前创建好的导入包文件中,进行导入包
?
?下面是输出结果:

?
总结
1.? ?模块的导入:1)import导入,如果有重名,就需要使关键字用as 取个别名
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?使用的时候用 模块. 的方法 使用导入的 全局变量、函数和类
? ? ? ? ? ? ? ? ? ? ? ? ? ?2)from...import 导入,使用的时候直接用就可以,同样出现重名,使用关键字? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?as 取别名
2.? ?包的导入:关键就是导入之前,一定要在__init__.py,这个特殊文件里面把外界需要使用的模块,通过使用 from . import 的语法,逐一导入
|