模块化

基本概念

需在另一个源文件里执行 import 语句,js 中为”import {xxx} from ‘xxx’ “,c#中为”using namespace xxx”,python 中为”from xxx import xxx”。
需要把引入命令放在脚本的顶端。
一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。
模块搜索路径:Python 解释器依次从搜索路径中去寻找所引入的模块,可以通过 sys.path 查看搜索路径。

代码示例

1、导入 sys 模块:

1
2
3
4
5
6
7
import sys

print('命令行参数如下:')
for i in sys.argv:
print(i)

print('\n\nPython 路径为:', sys.path, '\n')

2、导入同目录下某个模块的某个函数或变量
目录结构:

1
2
3
project/
main.py
package.py

package.py:

1
2
3
4
def fun1():
pass
def fun2():
pass

main.py:

1
2
from package import fun1
fun1()

3、导入其他路径下的某个模块
目录结构:

1
2
3
4
project/
main.py
packages/
package.py

package.py:

1
2
3
4
def fun1():
pass
def fun2():
pass

main.py:

1
2
from packages import package
package.fun1()

基本概念

包是一种管理 Python 模块命名空间的形式,采用”点模块名称”。
比如一个模块的名称是 A.B, 那么他表示一个包 A 中的子模块 B 。
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。

代码示例

目录只有包含一个叫做__init__.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块,当然这个文件中也可以包含一些初始化代码或者为__all__变量赋值。
我们可以在__init__.py 中的__all__=[]中定义这个包包含哪些模块,如果用户使用 from xxx import *时,就会引入__all__定义的模块。如果没有__all__就不会引入任何模块。
目录结构:

1
2
3
4
5
6
project/
main.py
packages/
__init__.py
package1.py
package2.py

__init__.py:

1
2
3
4
5
__all__=["package1","package2"]
if __name__=='__main__':
print("作为主程序使用")
else:
print("作为引入使用")

package1.py:

1
2
3
4
def fun1():
pass
def fun2():
pass

package2.py:

1
2
3
4
def fun3():
pass
def fun4():
pass

main.py:

1
2
3
from packages import *
package1.fun1()
package2.fun3()

无论是隐式的还是显式的相对导入都是从当前模块开始的。主模块的名字永远是”__main__“,一个 Python 应用程序的主模块,应当总是使用绝对路径引用。
包还提供一个额外的属性__path__。这是一个目录列表,里面每一个包含的目录都有为这个包服务的__init__.py,你得在其他__init__.py 被执行前定义。可以修改这个变量,用来影响包含在包里面的模块和子包。