模块和包
1. 模块
1. 概念
一个Python文件,以.py结尾,包含了Python对象和Python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码。
2. 导入模块
1. 导入模块的方式
* import 模块名
* from 模块名 import 功能名
* from 模块名 import *
* import 模块名 as 别名
* from 模块名 import 功能名 as 别名
2. 导入方式
- import
# 语法 # 1. 导入模块 import 模块名 import 模块名1, 模块名2…… # 不推荐 # 2. 调用功能 模块名.功能名()
# 示例 import math print(math.pow(2, 4)) # 输出结果 16.0
- form …… import ……
# 语法 from 模块名 import 功能1, 功能2, 功能3……
# 示例 from math import pow print(pow(2, 4)) # 输出结果 16.0
- from …… import *
# 语法 from 模块名 import *
# 示例 from math import * print(pow(2, 4)) # 输出结果 16.0
- as定义别名
# 语法 # 模块定义别名 import 模块名 as 别名 # 功能定义别名 from 模块名 import 功能 as 别名
# 示例 import math as mt from math import pow as pw print(mt.pow(2, 4)) print(pw(2, 4)) # 输出结果 16.0 16.0
3. 制作模块
每个Python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则。
1. 定义模块
def test(ia, ib):
print(ia + ib)
2. 测试模块
def test(ia, ib):
print(ia + ib)
# 只在当前文件中调用该函数, 其他导入的文件内不符合该条件,不执行test函数调用
# __name__是系统变量,是模块的标识符,如果是自身模块,值是__main__,否则是当前模块的名字
if __name__ == '__main__':
test(1, 2)
# 输出结果
3
4. 模块定位顺序
- 当导入一个模块,Python解释器对模块位置的搜索顺序:
- 当前目录
- 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
- 如果找不到,Python会查看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
- 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认路径。
- 注意
- 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
- 使用
from 模块名 import 功能
的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
- 注意
5. __all__
如果一个模块文件中有__all__
变量,当使用from …… import *
导入时,只能导入这个列表中的元素。
# Module1.py模块代码
__all__ = ['test1']
def test1():
print("test1")
def test2():
print("test2")
# 导入模块的代码
from Module1 import *
test1()
# test2()无法导入
# 输出结果
test1
2. 包
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py
文件,那么这个文件夹就称之为包。
1. 制作包
1. 示例
- 新建包
mypy
- 包
mypy
内新建模块Module1.py
和Module2.py
# Module1.py def get_module(): print(__name__)
# Module2.py def get_module(): print(__name__)
2. 导入包
- 方法1
# 语法 import 包名.模块名 包名.模块名.目标
# 示例 import mypy.Module1 mypy.Module1.get_module() # 输出结果 mypy.Module1
- 方法2
# 语法 # 注意:必须在__init__.py文件中添加__all__ = [],控制允许导入的模块列表。 from 包名 import * 模块名.目标
# 示例 - __init__.py __all__ = ["Module2"]
# 示例 - 执行文件 from mypy import * Module2.get_module() # 输出结果 mypy.Module2
3. __dict__
class People(object):
name = "cb"
def __init__(self):
self.age = 18
def get_info(self):
print(self.name)
pl = People()
# 返回类内部所有属性和方法对应的字典
print(People.__dict__)
# 返回实例属性和值组成的字典
print(pl.__dict__)
# 输出结果
{'__module__': '__main__', 'name': 'cb', '__init__': <function People.__init__ at 0x000001DF75D66AF0>, 'get_info': <function People.get_info at 0x000001DF75D66DC0>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
{'age': 18}