说到模块的概念,其实就必须要引入结构化程序设计的思想.
基础的结构化程序设计思想就是高内聚,低耦合.
具体来说就是一个程序必须要实现一系列的功能,这些功能应当由一系列子功能完成;每一个子功能对应的代码应当尽量少的与其他子功能代码产生联系;但子功能内部的各个组成元素如变量和代码等,互相联系非常紧密.这样就做到了高内聚低耦合.理想的程序设计就应该是用尽量少的数据在模块间互相通信以实现功能;修改模块内部的代码,不应当影响其他模块的工作.
结构化程序设计的思想在计算机科学的发展阶段以及现在软件工业中已经具体化成各种成熟的方法体系,一般称为软件设计模式.
软件设计的思想并不简单,可以参考代码大全2一书.
python的模块
教学博客地址
从程序设计广义的概念来讲,所有的能够实现一个功能的子程序都是模块module.
在python里,模块指的就是一个.py源程序文件.其实也可以
模块包含三种:
- python标准库
- 第三方模块
- 应用程序自定义模块
模块和包以及命名空间
每个模块都有独立的命名空间,所以不同模块之间的标识符并不会冲突,只不过注意标识符还是不要和关键字以及内置函数冲突.
如果模块本身的名字冲突怎么办? python引入了包(package)的概念,也就是一个文件夹如果下边有__init__.py文件,这个文件夹就是一个包.包是模块的一种.
如果相同名字的模块放在不同名字的包里,就可以独立使用了,只要在使用的时候最前边加上包名就可以了.
使用模块
使用当前程序的外部模块,需要使用import关键字.
import module_name | 引入模块,使用模块内的方法时需要用module_name.method |
import module_name as new_name | 引入method名称到当前命名空间并且将模块名命名为new_name,需要使用new_name.method来使用模块内方法 |
from module_name import method | 引入method名称到当前命名空间,直接可以使用method名称. |
from module_name import * | 将module_name的所有方法引用到当前命名空间,直接可以使用方法名称 |
Python标准库
python除了解释器环境之外,安装了很多可以直接导入并使用的模块,这些模块(包)被叫做<a href=""https://docs.python.org/3/library/"" target=""_blank"" rel=""noopener"">python标准库.python标准库是python的一部分,在需要实现内置功能以外的功能的时候,可以先看看python的标准库内是否有相关的处理方式,灵活使用标准库会让编程开发简单很多.
python标准库的组成部分:
- Built-in Functions 内置函数
- Built-in Constants 内置常量
- Built-in Types 内置数据类型
- Built-in Exceptions 内置异常
- 其他各种功能的模块
编写python程序的组织架构
目前成熟的程序,比如打开pycharm的目录:
<img src=""http://img.conyli.cc/posts/py11-01.png"" alt="""" width=""253"" height=""300"" class=""alignnone size-medium wp-image-317"" />
可以看到是以目录结构存放软件包的所有内容,一般执行文件放在bin下边,其他库放在lib下边,外部插件也单独存放,各种功能分开。
自行编写python程序也需要如此,通用的做法是程序入口文件叫做bin.py,放在bin目录下,然后程序运行时候自己编写的库放到软件目录下的lib目录。当然目录名称可以自定义,但是能够清晰的展现出软件结构。
不过这样有一个问题,就是在bin目录下边的程序需要引入自己定义的库要如何做呢,这就涉及到OS模块用相对路径,这样编写的程序无论安装到哪个目录之下,都可以正常调用自己软件包内的资源。
这里只是先提一下,后边OS模块有详细讲解。
导入模块的补充
使用import的时候,第一件事是找到文件,第二件事是在当前位置执行一遍.
import默认只会寻找PATH以及当前文件夹,import后边其实是默认有一个路径,就是当前程序的路径.
如果采用from xxx import zzz
前边的from也是给补完了一个路径,xxx可以是模块名,其实还可以是目录名.
自己编写的模块如果导入了其他模块,记住被导入的时候是在被执行的文件的路径,如果找不到会报错.
所以在模块里导入其他模块,一定要注意运行环境的路径和模块本身相对路径不同.
Pycharm在左侧导航窗口里选中文件可以直接复制路径,很快捷.