Python学习笔记(十九):模块与包的使用

目录

    • 1 模块
      • 1.1 导⼊模块的⽅式
      • 1.2 制作模块
      • 1.3 注意事项
      • 1.4 模块定位顺序
      • 1.5 __all__列表
    • 2 包
      • 2.1 制作包
      • 2.2 导⼊包
      • 2.3 通过__all__列表管理导入的模块

1 模块

Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。

1.1 导⼊模块的⽅式

  1. import 模块名
  2. from 模块名 import 功能名
  3. from 模块名 import *
  4. import 模块名 as 别名
  5. from 模块名 import 功能名 as 别名
#示例
import math
import numpy as np
from math import *

1.2 制作模块

在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))

1.3 注意事项

如果使⽤ 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)

1.4 模块定位顺序

当导⼊⼀个模块,Python解析器对模块位置的搜索顺序是:

  1. 当前⽬录
  2. 如果不在当前⽬录,Python则搜索在shell变量PYTHONPATH下的每个⽬录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径⼀般为/usr/local/lib/python/

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

注意:

  1. ⾃⼰的⽂件名不要和已有模块名重复,否则导致模块功能⽆法使⽤
  2. 使⽤from 模块名 import 功能 的时候,如果功能名字重复,调⽤到的是最后定义或导⼊的功能。

1.5 __all__列表

如果⼀个模块⽂件中有 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方法时提示该方法未定义。

2 包

包将有联系的模块组织在⼀起,即放到同⼀个⽂件夹下,并且在这个⽂件夹创建⼀个名字为 init.py ⽂件,那么这个⽂件夹就称之为包。

2.1 制作包

[New] — [Python Package] — 输⼊包名 — [OK] — 新建功能模块(有联系的模块)。
注意:新建包后,包内部会⾃动创建 init.py ⽂件,这个⽂件控制着包的导⼊⾏为。

2.2 导⼊包

语法:

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

2.3 通过__all__列表管理导入的模块

同样,我们可以在 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

你可能感兴趣的:(Python,python,编程语言,模块)