Python 学习笔记(11)模块
文章目录
11.1 模块定义
模块(Module)可以理解为python程序,任何python程序都可以被当作模块进行使用。
我们将python标准库中包含的模块称之为标准模块,除此之外还有第三方模块以及自定义模块。
如果说将编写代码的过程理解为搭建房子,那么我们所使用的函数就可以理解为不同的材料,而模块就相当于材料包。
模块的作用是提高代码的可维护性以及可重用性,不必将所有内容放在同一个代码文件中。
模块同样体现了代码的封装机制,相比于类是对于属性以及方法的封装,模块可以理解为更高级的封装,即将实现某类特定功能的代码放在同一个python文件中使其形成一个单独的模块供其他程序导入使用。
要注意的是,调用模块中的对象需要指明其属于哪一个模块,如果直接使用【import moduleName】的方法进行导入,则需要使用【moduleName.objName】的写法进行调用,避免解释器报错。
11.2 模块导入方式
在进行编程的过程中,很多函数都是不需要自己进行定义的,例如数学函数中求余弦、正弦或是绘图等,但大部分都属于外置功能,并不包含在python的标准库内置函数中,此时就需要使用 import
导入相应的模块后才能调用。
import moduleName_1[as xxx], moduleName_2
from moduleName import xxx [as xxx]
from moduleName import *
1)第一种引入方式会导入指定模块中的所有成员,包括变量、函数、类等等,在 as
后可以自定义模块名称;
2)第二种引入方式会导入模块中指定的成员,在使用时直接使用该成员名即可不需再重复指明来自哪个模块,也可以在 as
后可以自定义名称;
3)第三种引入方式可以导入模块中所有成员但不推荐使用,原因为不同模块中可能存在同名成员。
如何引入含空格模块名或数字开头模块名?
__import__("modelName")
11.3 自定义模块
自定义模块就是自己编写的python程序,编写完成后使用 import
导入即可,这里主要说明如何为自定义模块添加说明文档。
# demo.py
"""
demo.py包含:
FirstDemo类:包含string实例属性以及printStr()实例方法
"""
class FirstDemo():
def __init__(self, string):
self.string = string
def printStr(self):
print(self.string)
if __name__ == "__main__":
demo = FirstDemo("实例属性")
# test.py
import demo
print(demo.__doc__)
test = demo.FirstDemo("实例属性")
test.printStr()
Out:
Reloaded modules: demo
demo.py包含:
FirstDemo类:包含string实例属性以及printStr()实例方法
实例属性
通常在写完一个模块后需要编写一些测试代码以检查程序是否能够正常运行,但如果之后使用别的程序调用该模块但忘记删除测试代码,在运行程序时会直接运行测试代码。
为了避免这种情况,python定义了内置的系统变量 __name__
用于标识所在模块的模块名。对于当前正在运行的程序,输出其 __name__
为 __main__
;而被导入该程序中的模块输出其 __name__
为模块名。
因此可以使用if __name__ == "__main__":
语句来确保只有运行当前程序时,其中包含的内容才会被调用。因此该语句通常用于将模块中的测试代码屏蔽起来,在运行其他程序导入该模块时测试代码不会被执行。
11.4 ModuleNotFoundError: No module named ‘xxx’
这个Error通常出现在导入模块时找不到对应文件,通常情况下模块文件的查找顺序为:
1)在当前执行程序文件所在目录中查找;
2)在环境变量【PATHONPATH】中的目录去查找;
3)到python默认的安装目录中查找。
这些目录都会保存在 sys.path
中,当导入模块没有存储在 sys.path
显示的目录中时就会弹出该错误。
如何解决?
1)向 sys.path
中临时添加模块文件存储位置的完整路径(绝对路径);
import sys
sys.path.append(modulePath)
2)将模块放在 sys.path
中已包含的目录中;
3)设置系统环境变量。
11.5 限制模块可引用成员
被引用的模块中如果有需要隐藏的变量可以使用以下方法进行定义:
1)使用【单下划线】或【双下划线】开头命名变量、函数或类;
2)使用 __all__
变量定义可以被引用的成员,当其他文件以【from moduleName import xxx [as xxx]】的方式导入该模块时,该文件只能使用 __all__
列表中指定的成员。
def printStr(string):
print(string)
def multiplyStr(string, num):
print(string * num)
__all__ = ["printStr"]
11.6 包定义
为防止模块过多可能产生的模块名称冲突,python提出了包(Package)的概念。
包可以简单理解为包含着多个模块的文件夹,在python 2.x 版本中要求包中必须存在一个 __init__.py
模块,该模块的作用为告诉python将该目录当作包来处理。与普通的模块不同, __init__.py
模块的模块名为所在的包名而不是 __init__
。
包作为一个包含了多个模块的文件夹,其本质上还是模块,因此包中可以包含其他的包。
11.7 包导入方式
由于包的本质还是模块,其导入方式与模块的导入方式类似。
import packageName [.moduleName [as xxx]]
from packageName import moduleName
from packageName.moduleName import xxx
注意:import packageName
并不会导入该包内所有模块,而是导入包中的 __init__.py
模块,因此可以先在 __init__.py
模块中导入其他模块,访问该模块中的其他引用文件时需要加上包名。同时还可以在 __init__.py
模块中使用 __all__
来标记导入模块。
# __init__.py
import xxx
import xxx
...
__all__ = ['xxx', 'xxx' [, ...]]
# demo.py
import packageName
print(packageName.xxx [, ...])
11.8 查看模块中成员
1)dir()
函数能够获取所有模块成员,包括以下划线开头的特殊成员;
2)__all__
变量获取所有成员,不包括特殊成员;
3)help()
函数或 __doc__
用来查看成员的具体含义;
4)__file__
获得模块存储位置(绝对路径)。
print(dir(moduleName))
print(moduleName.__all__)
help(moduleName)
print(moduleName.__doc__)
print(moduleName.__file__)