8、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文件的代码在这里插入图片描述
  • __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中模块跟包的基本知识跟操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值