Python中模块与包
前言
- 随着我们的不断学习,我们需要认识和了解各种各样的不同的第三方包或者模块(例如我们之前使用的 import ***),下边我们带大家一起学习Python中有关模块跟包的有关知识。
一、模块介绍
"""
1、概述:
模块指的是 Module, 在Python中, 1个.py文件 = 1个模块.
你可以把 模块理解为 工具包, 工具包中有很多的工具. 其实就是: 每个.py文件中都有很多的 函数, 这些函数都有不同的功能.
2、大白话:
学模块, 就是记忆一些 .py文件, 以及其中的一些 函数.
例如: 随机数相关 用 random模块, 日期相关用 time模块, 文件路径相关用 os模块...
"""
二、模块的五种导入方式
"""
模块的 导入方式:
方式1: import 模块名
后续通过 模块名.函数名() 的方式调用. 模块下所有函数 均可使用
方式2: import 模块名 as 别名
后续通过 别名.函数名() 的方式调用. 模块下所有函数 均可使用
方式3: from 模块名 import 函数名
后续通过 函数名() 的方式直接调用. 只能使用该模块下 导入的函数.
方式4: from 模块名 import 函数名 as 别名
后续通过 别名() 的方式直接调用. 只能使用该模块下 导入的函数.
方式5: from 模块名 import *
后续通过 函数名() 的方式直接调用. 模块下所有函数 均可使用
"""
代码如下:
# 案例: 演示 导入模块的几种方式的 用法.
# 测试使用 time模块下的 time()函数, sleep()函数.
# 演示 方式1: import 模块名 后续通过 模块名.函数名() 的方式调用. 模块下所有函数 均可使用
import time
print('--- start ---')
time.sleep(2) # 让程序休眠 2秒.
print(time.localtime()) # 获取系统的的本地时间
print(time.time()) # 1719113316.0237932, 从时间原点(1970年1月1日 00:00:00 ~ 至今)的秒值.
print('--- end ---')
# 演示 方式2: import 模块名 as 别名 后续通过 别名.函数名() 的方式调用. 模块下所有函数 均可使用
import time as t
print('--- start ---')
t.sleep(2) # 让程序休眠 2秒.
print(t.localtime()) # 获取系统的的本地时间
print(t.time()) # 1719113316.0237932, 从时间原点(1970年1月1日 00:00:00 ~ 至今)的秒值.
print('--- end ---')
# 演示 方式3: from 模块名 import 函数名 后续通过 函数名() 的方式直接调用. 只能使用该模块下 导入的函数.
# from time import sleep, localtime
print('--- start ---')
sleep(2) # 让程序休眠 2秒.
print(localtime()) # 获取系统的的本地时间
# print(time()) # 报错, 因为没有导入, 所以使用不了.
print('--- end ---')
# 演示 方式4: from 模块名 import 函数名 as 别名 后续通过 别名() 的方式直接调用. 只能使用该模块下 导入的函数.
from time import sleep as sl, localtime as lt
print('--- start ---')
sl(2) # 让程序休眠 2秒.
print(lt()) # 获取系统的的本地时间
# print(time()) # 报错, 因为没有导入, 所以使用不了.
print('--- end ---')
# 演示 方式5: from 模块名 import * 后续通过 函数名() 的方式直接调用. 模块下所有函数 均可使用
from time import *
print('--- start ---')
sleep(2) # 让程序休眠 2秒.
print(localtime()) # 获取系统的的本地时间
print(time())
print('--- end ---')
三、自定义模块的调用方式
my_module1 模块的代码
# 这个是我们自定义的第 1个 模块.
# 如果不写all属性, 表示: 导入模块中 所有的函数.
__all__ = ['fun01', 'fun02']
# 函数 = 模块的功能, 相当于: 工具包中的工具
def get_sum(a, b):
print('我是 my_module1 模块的 函数')
print(__name__)
return a + b
def fun01():
print('我是 my_module1 模块的 函数')
print('----- fun01 函数 -----')
print(__name__)
def fun02():
print('我是 my_module1 模块的 函数')
print('----- fun02 函数 -----')
print(__name__)
# 实际开发中, 定义好模块后, 一般会对模块的功能(函数)做测试.
# 如下的测试代码, 在 调用者中 也会被执行. 但真实的业务场景, 测试代码 在 调用者中是不能被执行的.
# 那, 如何解决这个问题呢?
# 答案: __name__ 属性 即可解决这个事儿, 它在当前模块中打印的结果是 __main__,
# 在调用者模块中打印的是 当前的模块名.
# # 测试代码
# print(get_sum(10, 20))
# fun01()
# fun02()
# 如果条件成立, 说明是在 当前模块中执行的.
if __name__ == '__main__':
# 测试代码
print(get_sum(10, 20))
fun01()
fun02()
my_module2模块的代码
# 这个是我们自定义的第 2个 模块.
# 函数 = 模块的功能, 相当于: 工具包中的工具
def get_sum(a, b):
print('我是 my_module2 模块的 函数')
print(__name__)
return a + b
def fun01():
print('我是 my_module2 模块的 函数')
print('----- fun01 函数 -----')
print(__name__)
def fun02():
print('我是 my_module2 模块的 函数')
print('----- fun02 函数 -----')
print(__name__)
# 如果条件成立, 说明是在 当前模块中执行的.
if __name__ == '__main__':
# 测试代码
print(get_sum(11, 22))
fun01()
fun02()
测试模块的代码
"""
案例: 演示如何调用 自定义模块.
细节:
1. 1个.py文件就可以看做是1个模块, 文件名 = 模块名, 所以: 文件名也要符合标识符的命名规范.
2. __name__属性, 当前模块中打印的结果是 __main__, 在调用者中打印的结果是: 调用的模块名
3. 如果导入的多个模块中, 有同名函数, 默认会使用 最后导入的 模块的函数.
4. __all__ 属性只针对于 from 模块名 import * 这种写法有效, 它只会导入 __all__记录的内容
"""
# 需求: 自定义 my_module1模块, 然后再其中定义一些函数. 在当前模块中 调用 my_module1模块的内容.
# import my_module1 as m1
# import my_module1 as m2
#
# # print(m1.get_sum(10, 20))
# # m1.fun01()
# # m1.fun02()
#
# m1.fun01()
# m2.fun01()
# 如果导入的多个模块中, 有同名函数, 默认会使用 最后导入的 模块的函数.
# from my_module1 import fun01
# from my_module2 import fun01
#
# fun01()
# __all__ 属性只针对于 from 模块名 import * 这种写法有效, 它只会导入 __all__记录的内容
from my_module1 import *
# print(get_sum(10, 20)) # 报错, 因为 __all__ 属性没有记录它.
fun01()
fun02()
四、测试–包
- 包的结构
- __init__文件的代码
- all属性 如果不写, 默认是: 包中所有的 模块, 都不能通过 from 包名 import * 的方式导入
- _all_= [‘my_module1’]
代码如下:
"""
包 解释:
概述:
包 = 文件夹 = 一堆的.py文件(模块) + __init__.py 初始化文件.
背景:
当我们的模块(.py文件)越来越多的时候, 就要分包来管理它们了(模块).
导包方式:
方式1: import 包名.模块名
必须通过 包名.模块名.函数名() 的方式, 来调用 函数.
方式2: from 包名 import 模块名
必须通过 模块名.包名()的形式, 来调用函数.
"""
# 演示 导入包的 方式1: import 包名.模块名
# import my_package.my_module1
#
# # 包名 模块 函数名
# my_package.my_module1.fun01()
# my_package.my_module1.fun02()
# print('-' * 28)
# 演示 导入包的 方式2: from 包名 import 模块名
# from my_package import my_module1
#
# my_module1.fun01()
# my_module1.fun02()
from my_package import * # 会去 init.py文件 初始化文件中, 只加载 all属性的信息.
my_module1.fun01()
# my_module2.fun01() # 报错, 因为 from 包名 import * 的时候, 只会到 __init__.py文件中 all属性的内容.
总结
- 以上就是今天要讲Python中模块跟包的基本知识跟操作。