Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。
#示例
import math
import numpy as np
from math import *
在Python中,每个Python⽂件都可以作为⼀个模块,模块的名字就是⽂件的名字。也就是说⾃定义模块名必须要符合标识符命名规则。
下面我们定义一个名为MyModule的模块。
'''
自定义的MyModule模块
'''
def add(a,b):
return a+b
def double(a):
return a*2
在实际开中,当⼀个开发⼈员编写完⼀个模块后,为了让模块能够在项⽬中达到想要的效果,这个开发⼈员会⾃⾏在py⽂件中添加⼀些测试信息.,例如,在 my_module1.py ⽂件中添加测试代码。
'''
自定义的MyModule模块
'''
def add(a,b):
return a+b
def double(a):
return a*2
#测试语句
print(add(1,1))
此时,⽆论是当前⽂件,还是其他已经导⼊了该模块的⽂件,在运⾏的时候都会⾃动执⾏ testA 函数的调⽤。例如:
import MyModule
2
尽管我们只导入了MyModule模块,但还是执行了模块中的测试语句,对此我们需要采用一下方法避免。
我们在测试语句前加入__name__=='main’条件,当在模块当中时,name__为__main,而在别的文件中__name__为模块名MyModule,这样就避免了测试语句在导入的python文件中被执行。
__all__=['add']
def add(a,b):
return a+b
def double(a):
return a*2
#测试语句
#当在模块当中时,__name__为__main__,而在别的文件中__name__为模块名MyModule
if __name__=='__main__':
print(add(1,1))
如果使⽤ from … import … 或 from … import * 导⼊多个模块的时候,且模块内有同名功能。当调⽤这个同名功能的时候,调⽤到的是后⾯导⼊的模块的功能。
# 模块1代码
def my_test(a, b):
print(a + b)
# 模块2代码
def my_test(a, b):
print(a - b)
# 导⼊模块和调⽤功能代码
from my_module1 import my_test
from my_module2 import my_test
# my_test函数是模块2中的函数
my_test(1, 1)
当导⼊⼀个模块,Python解析器对模块位置的搜索顺序是:
模块搜索路径存储在system模块的sys.path变量中。变量⾥包含当前⽬录,PYTHONPATH和由安装过程决定的默认⽬录。
注意:
如果⼀个模块⽂件中有 all 变量,当使⽤ from xxx import * 导⼊时,只能导⼊这个列表中的元素(也就是与列表中存在字符串名称相同的方法或属性)。
'''
自定义的MyModule模块
'''
__all__=['add']
def add(a,b):
return a+b
def double(a):
return a*2
#测试语句
#当在模块当中时,__name__为__main__,而在别的文件中__name__为模块名MyModule
if __name__=='__main__':
print(add(1,1))
from MyModule import *
print(add(2,3))
print(double(2))
5
Traceback (most recent call last):
File "E:02allList.py", line 7, in <module>
print(double(2))
NameError: name 'double' is not defined
显然,因为__all__列表中没有double方法,使用double方法时提示该方法未定义。
包将有联系的模块组织在⼀起,即放到同⼀个⽂件夹下,并且在这个⽂件夹创建⼀个名字为 init.py ⽂件,那么这个⽂件夹就称之为包。
[New] — [Python Package] — 输⼊包名 — [OK] — 新建功能模块(有联系的模块)。
注意:新建包后,包内部会⾃动创建 init.py ⽂件,这个⽂件控制着包的导⼊⾏为。
语法:
import 包名.模块名
包名.模块名.⽬标
下面我们新建一个名为MyPackage的包,并在包中定义两个模块。
'''
my_module1
'''
def mo1_print():
print("module1")
if __name__=='__main__':
mo1_print()
'''
my_module2
'''
def mo2_print():
print("module2")
if __name__ == '__main__':
mo2_print()
通过包导入模块,再通过包调用模块中的方法,可以发现执行无误。
import MyPakage.my_module1
MyPakage.my_module1.mo1_print()
module1
同样,我们可以在 init.py ⽂件中添加 all = [] ,控制允许导⼊的模块列表。
'''
在__init__.py文件中通过__all__列表来控制可以导入的模块
'''
__all__=['my_module1']
此时通过from … import *导入MyModule包中的内容将只能导入my_module1一个模块。
from MyPakage import *
my_module1.mo1_print()
#此时未在__all__列表中的module2无法被导入
my_module2.mo2_print()
module1
Traceback (most recent call last):
File "E:/03package_test.py", line 11, in <module>
my_module2.mo2_print()
NameError: name 'my_module2' is not defined