python 3 基础之模块的制作、导入
模块
一个项目里的各个单位由小到大:
变量(全局变量、局部变量、实例属性、类属性)——>函数方法(实例方法、类方法、静态方法)——>类——>模块——>包——>工程(项目)
1、模块是什么?
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字
说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块
要使用非本.py文件里的类、函数或者变量等,必须先用import关键字引入模块名称,然后才能调用(模块名.函数名)
2、模块的制作
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字
2.1、定义一个模块test.py
def test_sum(a,b): return a + b
调用自己定义的模块
import test print(test.test_sum(3,4))
2.2、制作一个模块(正常代码、测试代码),if __name__ == ‘__main__‘
test.py
name = ‘制作模块‘ def add2num(a,b): return a + b class Person(object): def eat(self): print(‘人会吃饭‘) # 用来测试代码的函数(自测函数),一般命名main() def main(): print(name) ret = add2num(12,32) print(ret) p = Person() p.eat() # 调用测试函数 if __name__ == ‘__main__‘: main()
创建一个测试模块ceshi.py调用test.py
import test # 需要测试test模块,定义 一个本模块的测试函数 def main(): print(test.name) ret = test.add2num(222,22) print(ret) p = test.Person() p.eat() # 调用测试函数 if __name__ == ‘__main__‘: main()
解释:调用自测函数为什么不用main(),用if __name__ == ‘__main__‘
一个模块的自测函数调用方式使用了:if __name__ == ‘__main__‘
就会出现这样的情况:在本模块中可以正常调用自测函数,而在另外一个模块调用本模块时,自测函数不会运行(因为另外的模块不需要此自测函数,所以用这种方式)
在同一个.py文件中,打印__name__结果均为__main__;把一个test.py文件的打印__name__的代码封装成函数,导入另外一个模块cesh.py使用,打印出来的结果是test.py的模块名字test
3、导入模块(关键字import)
如果一个模块被另一个模块导入后 就把这个模块里面可以执行的代码都执行一遍
3.1、python中使用import 关键字导入模块
导入模块格式:
import 模块名1,模块名2.......... # 实例:导入随机模块 import random
当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
3.2、调用非本模块的函数
格式:模块名.函数名
调用非本模块的函数为何要加上模块名:
会有一种情况:在多个模块中含有相同名称的函数,若只是通过函数名来调用,解释器不知道到底要调用哪个函数,会报错。所以如果像上述这样引入模块的时候,调用函数必须加上模块名
3.3、单独调用非本模块的某个函数
此时只需要引入该函数即可:from.......import......
from 模块名 import 函数名1,函数名2....
不仅可以引入函数,还可以引入一些全局变量、类等
通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数
3.4、导入一个模块的所有东西(函数、变量、类)
from 模块名 import *
如果想一次性引入math中所有的东西,还可以通过from math import *来实现
from math import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
3.5、给导入的模块起别名 as
格式:import 模块名 as 别名(在此模块只使用别名即可)
3.6、模块中的__all__变量使用(只有配合from 模块名 import*使用才有效)
__all__也属于模块中的变量,如果一个模块用了__all__ = [‘变量1‘,‘变量2‘.....]
若在某个模块中使用了__all__,那么只有在__all__的列表中的字符串(变量)才可以被其他模块调用
要符合条件:其他模块必须是通过from 模块名 import* 方法导入的
如下test.py模块
test.py
# 条件 其他模块必须是通过from 模块名 import * 方式导入的模块 __all__ = ["name",‘add2num‘] name = "加法运算" def add2num(a, b): return a + b def delnum(a,b): return a - b
ceshi.py
from test import * # 可以正常调用 print(name) print(add2num(33,8)) # 调用delnum函数失败 f = delnum(33,2) print(f)
3.7、定位模块
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
当前目录
如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。