模块是指将一个完整的程序拆分成一个个的小模块。通过模块的组合,来搭建出一个完整的程序。模块化具有方便开发、方便维护、可以复用的优点。
模块(Module)是由一组类、函数与变量所组成的,模块文件的扩展名可能是.py(原始文本文件),也可能是.pyc(编译过的文本文件)。模块文件一般默认的python目录下的Lib文件夹里。
print('这是我的第一个模块')
print(__name__) # __name__的输出结果是其所在的模块名test1
def fun():
print('我要学python。')
然后~不要运行,在原文件内输入:
import test1
当时用import语句加载模块时,模块内的程序代码立刻被执行。
然后执行该文件
然后我们可以看到,test1被运行了(当然这个时候我们也可以调用test1模块里的fun()函数了,这里不再示例这个了。)
if name == ‘main’: 是模块中很常用也很重要的一个语句。
当py文件test1直接运行(不是在其他文件中用import test1的方式),__name__就会默认为字符串’main’,该判断语句结果就为True。
如果导入到其他模块中,__name__就是文件名’test1’,该语句判断结果就为False,判断语句的代码块就不会被执行。
在test1中写入如下代码
print('这是我的第一个模块')
print(__name__)
a = 2
def fun():
print('我要学python。')
class A():
def __init__(self, name):
self.name = name
print(self.name)
if __name__ == '__main__':
a = A('云雀叫了一整天')
print(a)
在test1中运行test1结果如下:
输出的变量a的值为字符串"云雀叫了一整天"。
在原文件中导入test1,则结果为:
输出变量a的值为2,没有被改为字符串“云雀叫了一整天”。
对比以感受差别。
类库(package)是由一组相同文件夹的模块组成的,也称“包”。每个类库的文件夹中至少含有一个__init__.py文件,类库可以包含子类库,子类库的文件夹应位于该文件夹下。子类库的文件夹中也至少含有一个__init__.py文件。
如email类库如图所示:
其中的mime是一个子类库,其组成如图所示:
导入类库中的模块:
import 类库.模块
文件夹里面如果包含了__init__.py文件就会识别为一个库,当其他文件进行导入这个库的时候就会运行__init__.py。
当加载一个类库时,此类库的子类库并不会随之加载,但是类库里的__init__文件会被执行。所以,如果想要随之加载,我们通常则必须在此类库的__init__.py文件中写入:
import 子类库1,子类库2,子类库3
这样的话,就可以使用子类库模块中的函数与变量等对象了。
在调用其之前,仍然是要加上前缀 模块名.,除非这个对象所在的模块a也在__init__里被写入import a 了,那可以不加前缀。不过一般而言,不加的话不一定正确,加了的话就总是没错的。
示例:
这是我们常用的统计分析库scipy,
它有一个字库stats,
子库stats里有一个模块也叫stats
from scipy import stats
我们用这个语句导入的是stats子库,不是stats模块。
使用的时候,如:
# 在求2项分布有p=0.5时进行100次试验成功20次的概率
stats.binom.pmf(20,100,0.5)
这里的stats指的是模块,因为stats模块还没有被执行,所以这里使用的时候要有前缀stats。
builtins是python的内建模块,所谓内建模块就是你在使用时不需要import,在python启动后,在没有执行程序员编写的任何代码前,python会加载内建模块中的函数到内存中。
下面是一些__builtin__模块的内置方法,可以将这些方法用在模块或类库中:
import types
types.__dict__
import types
types.__doc__
import types
types.__name__
这个上边说到过,用法有讲究。。。
import types
types.__file__