一、模块介绍
每一个 Python 脚本文件都可以被当成是一个模块。模块以磁盘文件的形式存在。当一个模块变得过大,并且驱动了太多功能的话,就应该考虑拆一些代码出来另外建一个模块。模块里的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块导 入( import)调用。模块可以包含直接运行的代码块、类定义、 函数定义或这几者的组合。
推荐所有的模块在Python模块的开头部分导入,导入顺序一般为:
- Python标准库模块
- Python第三方模块
- 应用程序自定义模块
二、导入模块
在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()