packages.png

模块化编程

模块化编程是一种体现模块化设计思想的编程技术。模块化设计思想广泛应用于各个工程领域,甚至在计算机出现之前,模块化设计的思想就已经出现。模块化设计指的是将复杂的系统分解为若干相互独立的子系统或组件,即模块。这些组件可以被独立地创建和测试,甚至也可以用于其他系统。采用模块化的编程技术,有助于我们开发可读性强、可靠性高和易于维护的程序,特别是开发具有一定规模的软件程序时。模块化编程技术是将代码分解成一些独立的部分,这些部分就称为模块。模块之间应相互独立,或者仅有极少的联系。这些模块就像乐高积木一样,可以构建出复杂的结构。

Python模块(Modules)

那什么是Python的模块呢?实际上,任何一段实现特定功能的python代码,只要保存为.py文件,就可以作为一个模块!它可以是一段函数的定义,可以是类的定义,甚至可以只是简单地定义几个变量。导入模块使用import语句,例如,我们要导入math模块,可以使用如下语句:

import math

导入math模块之后,我们就可以使用其中的变量、函数和类等,例如:

math.pi, math.sin(math.pi/2)
(3.141592653589793, 1.0)

可以在一个import语句中同时引入多个模块,只需将不同的模块用都逗号,隔开即可:

import random, os

如果希望直接使用模块中的内容,而不是像前面那样使用模块名.内容的形式,那么可以使用from ... import *的语法将模块中的所有内容一次性导入:

from math import *

pi

3.141592653589793

如果只需要引入模块中的部分内容,而不需要导入整个模块,则可以使用from ... import ...的语法,例如:

from math import sin, cos
sin(pi/2)
1.0

为了输入方便,我们也可以在导入模块时为模块起一个“代号”,例如我们可以用下面的语句导入numpy模块,并将其简称为np:

import numpy as np
np.arange(6)
array([0, 1, 2, 3, 4, 5])
Python包(Packages)

如果我们创建了很多模块,比如有数十甚至上百个模块时,我们可以将这些模块放在一个“包”中来管理。包实际上就是一个包含了许多Python文件(模块)和__init__.py文件的文件夹。也就是说,只要是包含了__init__.py并且放置于Python路径下的文件夹,都可以看作是一个包。

要创建包,首先我们需要一个建立一个文件夹,文件夹的名字既是包的名字。例如,我们创建一个名为simple_package的文件夹,这个文件夹中需要一个名为__init__.py的文件,这个文件的内容可以为空,也可以是其他Python代码,此文件中的代码将在包被导入时执行,因此它可以用来初始化一个包。例如,可以用它来确保导入其他一些必要的模块或参数。现在,我们在这个文件夹下创建两个简单的模块,a.py和b.py,其内容分别是:

a.py:
def bar():
print("Hello, function 'bar' from module 'a' calling").
b.py:
def foo():
print("Hello, function 'foo' from module 'b' calling").
然后,我们再创建一个空文件__init__.py。
注意:在导入包之前,要确保将包放在Python路径下,或者将包所在的路径加入到系统路径。
# 将包所在的路径加入系统路径
import sys
sys.path.append(r'/home/username/Documents/Coding/python_tutorial/')
import simple_package
simple_package
simple_package/a
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
 in ()
----> 1 simple_package/a
NameError: name 'a' is not defined
simple_package/b
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
 in ()
----> 1 simple_package/b
NameError: name 'b' is not defined

通过上面的命令提示我们发现,虽然已经导入了simple_package这个包,但是a和b两个模块却没有被导入。我们可以采用下面的方式来导入这两个模块:

from simple_package import a,b
a.bar()
Hello, function 'bar' from module 'a' calling.
b.foo()
Hello, function 'foo' from module 'b' calling.

虽然通过上面的方式我们导入了a和b两个模块,但是如果我们希望导入simple_package包时就自动导入其中的模块,则我们可以利用__init__.py这个文件来实现。我们只需要在__init__.py文件中加入如下两行代码即可:

import simple_package.a
import simple_package.b
import simple_package
simple_package.a.bar()
Hello, function 'bar' from module 'a' calling.
simple_package.b.foo()
Hello, function 'foo' from module 'b' calling.

关于模块和包的内容我们就先介绍到这里,在实际应用中如果需要更多关于模块和包的知识,可以查阅Python在线文档和相关的在线教程。