Python 提供了强大的模块支持,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。
模块(Modules),可以理解为是对代码更高级的封装,即把能够实现某一特定功能的代码编写在同一个文件中,
其后缀名是.py
。并将其作为一个独立的模块,这样既可以方便其它程序或脚本导入并使用,同时还能有效避免函数名和变量名发生冲突。
可以用一句话总结:模块就是 Python 程序。
模块不仅可以提高代码的可维护性,还可以提高代码的可重用性。
使用 Python 源文件,只需在另一个源文件里执行 import 语句。当 Python解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。
基本语法如下:
import 模块名1 [as 别名1], 模块名2 [as 别名2],…
该方式会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
示例代码如下:
# 导入sys、os两个模块,并为sys指定别名s
# import sys as s, os
import os
import sys as s
# 使用模块别名作为前缀来访问模块中的成员
print(s.argv[0])
print(os.sep)
基本语法如下:
from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
该方式只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。
示例代码如下:
# 导入sys模块的argv,winver成员
from sys import argv, winver
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
print(winver)
基本语法如下:
from 模块名 import *
该方式把一个模块的所有内容全都导入到当前的命名空间也。但此方式不推荐使用。
# 导入sys 棋块内的所有成员
from sys import *
# 使用导入成员的语法,直接使用成员的别名访问
print(argv[0])
print(winver)
Python 模块就是 Python 程序,我们把代码编写在一个文件中,其后缀名是.py。就搞定了。
我们创建 MyMod1.py 文件,在里面放置了变量、函数以及一个类,该文件就可以作为一个模板。
示例代码如下:
"""
MyMod1 模块中包含以下内容:
name 变量:初始值为None
age变量:初始值为 0
函数:包括 speak() 和 say()
Class1类:包含 name 和 age 属性和 say() 方法。
"""
# 变量
name = None
age = 0
# 函数
def speak():
print("%s 说: 我 %d 岁。" % (name, age))
def say():
print("人生苦短,我学Python!")
# 类
class Class1:
name = "赵云"
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
def say(self):
print("%s 说: 我 %d 岁。" % (self.name, self.age))
# 测试代码
say()
speak()
print("---------")
obj = Class1("赵子龙", 18)
obj.say()
print("---------")
say()
speak()
自定义模块编写说明文档:
为自定义模块添加说明文档,和函数或类的添加方法相同,即只需在模块开头的位置定义一个字符串即可。
可以通过模板的__doc__ 属性
,来访问模板的说明文档。
在 test.py 文件中,查看 MyMod1的文档。
import MyMod1
print(MyMod1.__doc__)
__name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用
__name__属性来使该程序块仅在该模块自身运行时执行
。
说明: 每个模块都有一个__name__属性
,当其值是'__main__'
时,表明该模块自身在运行,否则是被引入。
在 MyMod1.py 模块中添加下面代码:
if __name__ == '__main__':
print('程序自身在运行')
speak()
else:
print('我来自另一模块')
__all__变量
模块提供的
__all__ 变量
,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。即其他文件只能导入该变量指定的成员,未指定的成员是无法导入的。
注意
:__all__ 变量仅限于
在其它文件中以“from 模块名 import *”的方式引入。否则该变量是无效的。
在 MyMod1.py 模块中添加下面代码:
__all__ = ["speak", "Class1"]
执行 test.py 文件:
包是一个包含多个模块的文件夹,它的本质依然是模块,只不过在该文件夹下存在一个名为“init.py” 的文件。
注意:
__init__.py
的模块,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Python 要将该目录当成包来处理。在 dir4的文件夹中,新建一个__init__.py
的模块。那么 dir4就是一个包了(使用IDEA 创建包的话,会自动创创建该文件)。
包其实本质上还是模块,因此导入模块的语法同样也适用于导入包。
import 包名[.模块名 [as 别名]]
在使用模块中的成员(变量、函数、类)时,需添加“包名.模块名”为前缀。
import dir4.MyMod1
dir4.MyMod1.say()
from 包名 import 模块名 [as 别名]
在使用其成员时不需要带包名前缀,但需要带模块名前缀。
from dir4 import MyMod1
MyMod1.say()
from 包名.模块名 import 成员名 [as 别名]
此语法格式用于向程序中导入“包.模块”中的指定成员(变量、函数或类)。通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用。
from dir4.MyMod1 import Class1
obj = Class1("赵子龙", 18)
obj.say()
__file__ 属性
通过 __file__ 属性
查找该模块(或包)文件所在的绝对路径(输出它的 init.py 文件的存储路径)。
import dir4.MyMod1
print(dir4.__file__) # D:\JQWS\PythonWS\demo1\dir4\__init__.py
dir() 函数:用来列出某个类或者某个模块中的全部内容,包括变量、方法、函数和类等。
import dir4.MyMod1
print(dir(dir4.MyMod1))
# ['Class1', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'age', 'name', 'say', 'speak']
# print(dir(str))
help() 函数:用来查看某个函数或者模块的帮助文档。
print(help(str.lower))
– 求知若饥,虚心若愚。