第二十四课:模块和包

本文详细介绍了Python中的模块和包的使用,包括模块的导入、制作,包的定义及导入,强调了`__init__.py`文件的重要性,以及`__all__`变量在控制导入行为中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、模块介绍

        每一个 Python 脚本文件都可以被当成是一个模块。模块以磁盘文件的形式存在。当一个模块变得过大,并且驱动了太多功能的话,就应该考虑拆一些代码出来另外建一个模块。模块里的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块导 入( import)调用。模块可以包含直接运行的代码块、类定义、 函数定义或这几者的组合。

        推荐所有的模块在Python模块的开头部分导入,导入顺序一般为:

  1. Python标准库模块
  2. Python第三方模块
  3. 应用程序自定义模块

二、导入模块

        在Python中用关键字import来引入某个模块,比如要导入模块time,就可以在文件最开始的地方用import time来引入。

import time

        也可以在一行内倒入多个模块:

import time,random,os,jieba

         在调用模块中的函数时,必须加上模块名调用,因为可能存在多个模块中含有相同名称的函数,此时,如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。为了避免这样的情况,调用函数时,必须加上模块名。

import time
print('go')
#模块里的方法调用:模块名.函数名
time.sleep(3)   #暂缓三秒
print('end')

        Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。 使用这种方式导入,不会整个模块导入到当前命名空间,它只会将import的内容导入。

from time import sleep
print('go')
#此方法调用模块,可直接使用模块里的函数名
sleep(3)   #暂缓三秒
print('end')

        导入一个模块的所有内容也可以使用from … import *

from time import *

        还可以给导入的模块中的方法命名,但不建议使用。

import time as t    #使用as重新命名,不建议使用
print('go')
t.sleep(3)   #暂缓三秒
print('end')

三、模块制作

        一个.py文件其实就可以当作一个模块,对于一个软件项目来说不可能把所有代码都放在一个文件中实现,它们一般会按照一定规则在不同的目录和文件中实现。

        1.如果调用文件与被调用文件在一个目录下面,即同级目录,则可以非常方便地调用。调用方法为 :

        import  同级目录.调用文件

'''
    在同级的目录中导入
'''
import 自定义模块.test1
import 自定义模块.test2
自定义模块.test1.test_1()
自定义模块.test2.test_2()

        2.跨目录调用时,需要先添加目标路径导入当前环境中,再进行调用。

import sys
# 添加目标路径导当前环境中
sys.path.append("..\\") #返回上一级目录
# print(sys.path)

'''
运行的时候在sys.path里添加了这个模块的路劲,所以能正确执行。
'''
import 上级目录.test3
上级目录.test3.test_3()

from 上级目录 import test3
test3.test_3()

        3.当你导入一个模块时,Python解析器对模块位置的搜索顺序是:

                ①当前目录。

                ②如果不在当前目录,Python则搜索在环境变量PYTHONPATH下的每个目录。

                ③如果都找不到,Python会察看默认路径。

                ④模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

        4.dir()函数:一个排好序的字符串列表,内容是一个模块里定义过的名字。返回的列表容纳了在一个模块里定义的所有模块,变量和函数。

from 自定义模块 import math
print(dir(math))
'''
['__builtins__', '__cached__', '__doc__', '__file__', 
'__loader__', '__name__', '__package__', '__spec__', 'pow1']
'''

四、包的定义

        1.包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块B;

        2.目录中只有包含一个叫做__init__.py的文件才会被认作是一个包 ;

        3.在导入包的时候,Python会从sys.path中的目录来寻找这个包中包含的子目录

五、导入包

        目录中只有包含了叫做__init__.py的文件,才能被程序认作是包,模块才能被导入成功。现在我们就在msg文件夹下创建一个__init__.py文件,并且一定要在文件中写入__all__。

from 模块.自定义模块 import *
print(math.pow1(1,2))
test1.test_1()
test2.test_2()

         最后结果如图:

         总结:

        1.编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)

         2.模块中不使用__all__属性,则导入模块内的所有公有属性,方法和类 。 模块中使用__all__属性,则表示只导入__all__中指定的属性, 因此,使用__all__可以隐藏不想被import的默认值。 __all__变量是一个由string元素组成的list变量。 它定义了当我们使用 from <module> import * 导入某个模块的时候能导出的符号(这里代表变量,函数,类等)。

         3.from <module> import * 默认的行为是从给定的命名空间导出所有的符号(当然下划线开头的变量,方法和类除外)。 需要注意的是 __all__ 只影响到了 from <module> import * 这种导入方式, 对于 from <module> import <member> 导入方式并没有影响,仍然可以从外部导入。

        练习:

'''
    请创建一个Die 类,它包含一个名为sides的属性,该属性的默认值为6。
编写一个名为roll_die()的方法,它打印位于1 和骰子面数之间的随机数。创建一个6 面的骰子,再掷10 次。
'''
from random import randint

#创建类
class Die():

    def __init__(self,sides=6):
        self.sides = int(sides)

    def roll_die(self):
        if self.sides >= 1:
            n=int(input('请输入你想投骰子的次数:'))
            for i in range(1,n+1):
                print('你第%d次投骰子的点数为:%d'%(i,randint(1, self.sides)))
        else:
                print('不存在这样的骰子!')

if __name__ == '__main__':
    x = Die()
    x.roll_die()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值