模块
模块是程序中一些重用函数的集合。
创建模块有两种方式,
一、创建包含函数和变量的.py
文件
如下,我们创建MyFun.py
文件
def testFunc():
print('模块导入测试')
i = 10086
__version__ = '0.1'
接着我们在ModulesTest.py
文件中通过import导入MyFun.py,然后就可以通过MyFunc.testFunc()
或MyFunc.i
的方式,访问和使用它里面的变量或函数,
import MyFunc
MyFunc.testFunc()
print(MyFunc.i + 1)
当然,我们也可以通过from...import...
的方式来导入模块,不用通过MyFunc.testFunc()
或MyFunc.i
的方式使用其中的变量和函数,
from MyFunc import testFunc,i
# from MyFunc import *
testFunc();
print(i + 1)
说明
from MyFunc import *
这种方式不会导入__version__
不过,不建议使用这种方式,因为变量名或者函数名很有可能会和需要导入py
文件里面的变量名或者函数名重复。
二、使用撰写Python
解释器本身的本地语言来编写模块
我们可以使用C/C++
语言来编写Python
模块,在编译之后就可以通过标准的Python
解释器在代码中使用它们。
这一部分,在后面学习之后再补充。
模块的__name__
通过模块的名称__name__
,我们可以判断某模块是独立运行的还是被导入进来的。具体如下,
if __name__ == '__main__':
print('模块是被导入进来的')
else:
print('模块是独立运行的')
说明
每个Python模块都定义了它的
__name__
属性,如果它与__main__
属性相同,则说明该模块由用户独立运行的、可以做一些其它操作,否则就是导入进来的。
dir( )
函数
-
dir( )
函数能够返回对象所定义的名称的列表,如果对象是模块时,则会返回所定义的函数、类与变量。 -
dir( )
传入参数时,返回的是传入参数对象的名称列表,没有参数时,返回当前模块的名称列表。
请看下面的练习
DirTest.py
import MyFunc
print('MyFunc中的名称列表:',dir(MyFunc))
del MyFunc.i
print('MyFunc中的名称列表:',dir(MyFunc))
print('当前模块中的名称:',dir())
控制台输出
MyFunc中的名称列表: ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', 'i', 'testFunc']
MyFunc中的名称列表: ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', 'testFunc']
当前模块中的名称: ['MyFunc', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
Process finished with exit code 0
其中,我们通过 del 名称
来删除一个名称,删除之后,就不能再进行访问。
此外dir( )
函数能够对任何对象工作,eg
.dir(str)
可以访问str(String,字符串)
类的属性。虽然vars( )
函数也能返回这些值的属性,但它不是针对所有类都能正常工作的。
包
- 变量通常位于函数内部,函数和全局变量通常位于模块内部,包 用来组织起这些模块。
- 包是指一个包含模块与一个特殊的
__init__.py
文件的文件夹,后者向Python
表明这一文件夹是特殊的,因为其包含了Python
模块。 - 包是一种能够方便地分层组织模块的方式。
如下,创建一个名为world
的包,其中包含asia
、africa
等其他子包,同时这些子包下面都包含india
、madagascar
等模块,
具体的文件夹的结构如下
总结
函数是程序中的可重用部分,模块是可重用的程序,包用以组织模块的另一种层次结构。