1、定义
在python
中,一个.py
文件就是一个模块(module),在每个.py
文件中,可以定义一系列封装类似功能的变量、函数、类等。包含多个.py
文件的文件夹组成了一个包(package),当然在这个文件夹中必须要包含一个__init__.py
文件。他们都可以通过import
语句导入。不论是一个单独的.py
文件,还是一个包,我们都可以将其称为模块。
2、模块的导入
2.1 使用import语句
语法格式如下:
import 模块名
:在调用时,直接使用 模块名.功能名import 模块名 as 别名
:在调用时使用 别名.功能名from 模块名 import 功能名
:调用时直接使用功能名即可from 模块名 import 功能名 as 别名
:在调用时使用别名即可from 模块名 import *
:在调用时,直接使用模块中的功能名即可,但一般不推荐这样使用。
当然,如果模块中还分成了各个‘小‘模块,可以直接在模块名后直接加.
’小’模块名。
各种语法格式示例如下:
import os
import os as o
import os.path
import os.path as o_pth
from sys import path
from sys import path as pth
from matplotlib.pyplot import plot
from matplotlib.pyplot import plot as plt
from datetime import *
注意:
在执行
import
语句时,会按照以下顺序查找指定的模块:
- 当前目录下
PythonPATH
(环境变量)下中的每个目录中Python
默认的安装目录当出现找不到模块时可以通过如下方式解决:
- 向
sys.path
中添加模块的完整路径- 将模块放入
sys.path
中已经包含的路径下- 设置系统的环境变量
2.2 使用__import__导入
__import__
是一个函数,用于动态加载模块,一般在日常编程中用不到。
__import__(name, globals=None, locals=None, fromlist=(), level=0)
它主要用于根据name
导入模块。
name
参数中可以有.
号,如果fromlist
参数为空,则会返回第一个.
号之前的名称命名的包,而不是以name
命名的模块,如果fromlist
参数不为空,则返回以name
命名的模块。
# 例如模块结构如下:
root
└─ test_pkg
│ ├─ __init__.py
│ └─test1.py
└─demo.py
在test1.py
文件中定义了test()
函数,要想从demo.py
中通过__import__()
函数导入它。
test1 = __import__("test_pkg.test1")
test1.test()
这样直接调用是不行的,会报错AttributeError: module 'test_pkg' has no attribute 'test'
也就是验证了上面所说的,fromlist
中为空,则会返回第一个.
号之前的名称命名的包。
这个fromlist
参数没有任何要求,只要不为空,就可以正常返回name
参数最右端的模块。
test1 = __import__("test_pkg.test1", fromlist=('t', 'f'))
test1.test()
这样就可以调用成功。
2.3 使用importlib导入模块
importlib
是python
的一个库,可以通过其中的import_module()
方法来导入模块。
import importlib
test1 = importlib.import_module("test_pkg.test1")
test1.test()
上面是使用绝对路径导入模块的情况。我们还可以使用相对的路径来导入。
import importlib
test1 = importlib.import_module(".test1", package='test_pkg')
test1.test()
同样的都能成功导入模块。
3. 定义模块
最简单的就是将所有的功能、变量和类放到同一个.py
文件中,在导入的时候直接导入即可。
如果是要定义一个模块,其中包含多个.py
文件,则需要创建一个文件夹,在这个文件夹中需要有一个__init__.py
文件。
__init__.py
文件的主要作用就是将一个目录识别为package
,标识这个文件夹是一个包;第二个作用就是定义package
中的__all__
,用来模糊导入。
注:
__all__
的作用就是当该文件被当做模块导入时,只有在__all__
中指定的方法或者类或者变量能够被访问到,只有在通过from module_name import *
进行导入时会受到影响,其它import
语句不受影响。
# test.py
__all__ = ['test']
def test():
print("test")
def test1():
print("test1")
# main.py
from test import *
test1()
# 执行main.py将会报错如下:
NameError: name 'test1' is not defined
在导入模块是,.py
文件中的if __name__ == '__main__':
后面的代码不会被执行。如果要测试该模块中的代码是否正确,可以将测试代码写在if __name__ == '__main__':
之后。
__name__
是一个变量,当直接使用python
命令来运行一个模块的时候,__name__
变量的值就是__main__
,当其被导入其它程序中时,__name__
变量就是模块名。
# test.py
def test__name__():
print(__name__)
# main.py
import test as t
t.test__name__()
#运行main.py后的输入如下:
test
在模块中我们可以加入对模块的一些解释性文档,在模块的第一行代码之前定义"""文档"""
即可,然后在其他程序调用该模块时,通过__doc__
就可以查看模块的文档。
# test.py
"""
这是一个文档,其中定义了test方法
"""
def test():
"""
这是test方法
:return:
"""
print("test")
# main.py
import test
print(test.__doc__) # 这里将返回整个文件最前面的文档内容。
print(test.test.__doc__) # 这里将返回函数下面定义的文档内容。
如果我们想要查看一个模块的源代码,但是找不到文件时,可以使用__file__
属性来查看模块的源码路径,这会返回模块文件的绝对路径。
如有错误欢迎批评指正!!!