计算机开发中,随着开发的进行,代码量也越来越多,全部放在一个文件中只会越显臃肿以及难以维护。
所以,众所周知,对代码根据函数进行分组分类,放到不同的文件中。这样调试可以分开进行,而代码也容易被引用。
在python中,一个.py文件就是一个模块(Module)。
但又会想到,不同人编写了名字相同的模块,怎么办?
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
例如,以上就是一个具体的python模块和包。
可以看到ForStudy这个包中,还有一个__init__.py的模块,这个模块有什么用呢?
__init__.py 有两个用途 :
1、是表示目录下面的python 程序是module 的一部分
2、module 自身以及submodule 的初始化和声明。
如果没有__init__.py 这个文件,那么对于该包的引用是无效的,即不可以引用。
一般包还会包含一个__version__的变 量,保存这个包的版本信息,另外还有一个__all__的列表,包括要import 时要导入的模块。
当然,__init__.py的内容不是绝对的,也可以什么都不写,还可以加上其它任何自己认为需要的代码。
导入模块用import module或者from module import *,它们是有区别的:
import module会导入module这个模块里的所有标识,但是这些标识现在都在module名字空间下。
from module import *也会导入module中所有标识,但是标识不在module名字空间下了,它放到在当前名字空间里。并且,这句话执行完之后,当前名字空间中并不存在 module这个标识。from ... import ...语句还可用于从一个模块中导入部分标识,写法是"from module import 标识名",这样就只有指定的标识被导入,这种方式可以精确控制导入的内容,防止导入整个模块造成名称污染。
import和from ... import还可用于导入包。可以from 包.子包.模块 import 函数,也可以form 包.子包 import*,还可以from 包.子包 import 模块。
根据展示的图片,来一个实例。
首先,class02.py中的代码如下(也就是上期的代码):
__author__ = 'wadetamg'
# -*- coding: UTF-8 -*-
class Student():
def __init__(self,name,score):
self.__name=name
self.__score=score
def get_name(self):
return self.__name
def get_score(self):
return self.__score
def set_score(self,score):
self.__score=score
return self.__score
在PythonWorkspace中新建了一个文件MandP.py,写上程序调用该包和包中的模块:
__author__ = 'wadetang'
from ForStudy import class02
daming = class02.Student("daming",90)
print daming.get_name()
print daming.get_score()
打印可得:
daming
90
值得一提的是,python中可以安装很多很强大的第三方模块,比如这个ez_setup.py(https://pypi.python.org/pypi/setuptools#windows)。其他常用的第三方库还有MySQL的驱动:MySQL-python,用于科学计算的NumPy库:numpy,用于生成文本的模板工具Jinja2,等等。而python一些第三方模块的安装,就自行搜索吧!