Python-模块化
模块化
基本概念
需在另一个源文件里执行 import 语句,js 中为”import {xxx} from ‘xxx’ “,c#中为”using namespace xxx”,python 中为”from xxx import xxx”。
需要把引入命令放在脚本的顶端。
一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。
模块搜索路径:Python 解释器依次从搜索路径中去寻找所引入的模块,可以通过 sys.path 查看搜索路径。
代码示例
1、导入 sys 模块:
1 | import sys |
2、导入同目录下某个模块的某个函数或变量
目录结构:
1 | project/ |
package.py:
1 | def fun1(): |
main.py:
1 | from package import fun1 |
3、导入其他路径下的某个模块
目录结构:
1 | project/ |
package.py:
1 | def fun1(): |
main.py:
1 | from packages import package |
包
基本概念
包是一种管理 Python 模块命名空间的形式,采用”点模块名称”。
比如一个模块的名称是 A.B, 那么他表示一个包 A 中的子模块 B 。
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。
代码示例
目录只有包含一个叫做__init__.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块,当然这个文件中也可以包含一些初始化代码或者为__all__变量赋值。
我们可以在__init__.py 中的__all__=[]中定义这个包包含哪些模块,如果用户使用 from xxx import *时,就会引入__all__定义的模块。如果没有__all__就不会引入任何模块。
目录结构:
1 | project/ |
__init__.py:
1 | __all__=["package1","package2"] |
package1.py:
1 | def fun1(): |
package2.py:
1 | def fun3(): |
main.py:
1 | from packages import * |
无论是隐式的还是显式的相对导入都是从当前模块开始的。主模块的名字永远是”__main__“,一个 Python 应用程序的主模块,应当总是使用绝对路径引用。
包还提供一个额外的属性__path__。这是一个目录列表,里面每一个包含的目录都有为这个包服务的__init__.py,你得在其他__init__.py 被执行前定义。可以修改这个变量,用来影响包含在包里面的模块和子包。