一个实际应用的程序往往有多个模块、文件以及其它资源构成,为了清晰有效的组织这些程序,我们需要包来管理这些资源。Python中也支持包的概念。
Python包是存放程序模块和子包的文件夹,是包含若干子包和模块的命名空间。
每个包必须包含一个名为“__init__.py”的特殊文件,这个文件的内容可以为空,也可以包含导入模块的数据或信息。
包内可以存放的资源
在Python创建一个包可以分为两步:
(1)创建一个文件夹,并给这个文件夹一个合适的名字,文件夹的名字就是包的名字。
我们可以在操作系统准备创建包的目录中直接创建,也可以在Python的集成开发环境中进行创建。
(2)在这个文件夹中创建__init__.py文件,这样就把一个普通的文件夹转换成了Python包。这个文件用于初始化包并列出包的所有模块。也可以保持为空。
同样可以在一个包里创建一个或多个子包,每个包中都要包含__init__.py文件。
用户可以使用import导入定义的包。
其语法如下:
import packagename.subpackage1.subpackage2.modulename
import packagename.subpackage1.subpackage2.modulename as newModuleName
下面先给出包及文件的组织情况:
在Common包中包含两个子包:math和strings,math包中又包含两个子包:basic和high。
在具体创建文件时,可以在这些文件夹下直接创建文件,也可以在创建完毕后拷贝到相应的文件中。
使用像Pycharm这种集成的开发环境,可以方便的创建Python包,并在相应的包中创建python文件。
文件suanshu.py中的内容如下:
'''
求x+y的和
'''
def add(x, y):
return x + y
'''
求x - y的差
'''
def sub(x, y):
return x - y
'''
求x / y的商
'''
def div(x, y):
if y == 0:
raise('除数不能为0.')
return x / y
'''
求x*y的积
'''
def mul(x, y):
return x * y
文件bijiao.py中的内容如下:
'''求最大值'''
def max(x,y):
if x>=y:
return x
else:
return y
'''求最小值'''
def min(x, y):
if x <= y:
return x
else:
return y
文件str_utils.py中的内容如下:
'''字符串转大写'''
def toUpper(s):
return s.upper()
'''字符串转小写'''
def toLower(s):
return s.lower()
'''字符串翻转'''
def reverse(s):
return s[::-1]
下面讲解具体使用方法。
在Common所在的同一目录中(注意不是在Common文件夹中)创建测试文件,如test.py。
(1)在test.py中导入若干方法
from Common.math.basic.suanshu import add,sub
x = 5
y = 3
print(add(x, y))
print(sub(x, y))
print(div(x, y))
输出结果:
8
2
Traceback (most recent call last):
File "D:/98progarm/python/test.py", line 7, in <module>
print(div(x,y))
NameError: name 'div' is not defined. Did you mean: 'dir'?
结合代码和运行结果,我们可以看出,通过from...import语法从Common.math.basic.suanshu中导入了add和sub两个方法,而没有导入div方法,所以,前两个输出了正确的结果,而第3个输出语句给出了NameError错误。
(2)导入整个模块中的所有内容
可以直接使用下面的语法格式导入包:
import Common.math.basic.suanshu
使用这种导入包或模块时,需要使用包的全名来使用相关功能。
import Common.math.basic.suanshu
x = 5
y = 3
print(Common.math.basic.suanshu.add(x, y))
print(Common.math.basic.suanshu.sub(x, y))
print(suanshu.div(x, y))
输出结果:
8
2
Traceback (most recent call last):
File "D:/98progarm/python/test.py", line 7, in <module>
print(suanshu.div(x,y))
NameError: name 'suanshu' is not defined
从源程序和输出结果可以看出,使用 import 包名.子包(模块)方式引入的方式需要带上包全路径名称。
为了使用上的方便也可以使用下面的方式给引入的包起个别名。
(3)导入包时给包起别名
import Common.math.basic.suanshu as m
x = 5
y = 3
print(m.add(x,y))
print(m.sub(x,y))
print(m.div(x,y))
输出结果如下:
8
2
1.6666666666666667
从源程序可以看出导入包时给包起别名可以大大减轻书写上的困难。
(4)使用import *导入全部子模块
可以使用下面的语法导入某个包中的所有子模块。
from package.subpackage import *
上面这个语句的含义是从package.subpackage包中导入所有模块。
但这种语句并非我们想象的那样:从package.subpackage导入所有模块,它需要在需导入模块所在的包的__init__文件中定义名为__all__的列表,在该列表中定义由 import * 需要导入的模块名称。
如,我们在basic这个包的__init__文件中添加了下面的语句:
__all__ = ["suanshu"]
然后修改test.py文件中的内容如下:
from Common.math.basic import *
x = 5
y = 3
print(suanshu.add(x,y))
print(suanshu.sub(x,y))
print(suanshu.div(x,y))
输出结果如下:
8
2
1.6666666666666667
当然,我们也可以使用下面的形式导入一个模块中的所有内容。
(5)导入一个模块中的所有内容
我们可以使用下面的语法格式导入一个模块中的所有内容:
from package.subpackage.module import *
上面的语句含义是从子包subpackage导入module模块中的所有内容,这样,我们可以直接使用module定义的内容,而不必带前缀。
from Common.math.basic.suanshu import *
import Common.math.high.bijiao as h
x = 5
y = 3
print(add(x,y))
print(sub(x,y))
print(div(x,y))
print(h.max(x,y))
输出结果如下:
8
2
1.6666666666666667
5
新闻热点
疑难解答