首页 > 开发 > Python > 正文

Python中包的创建与使用

2023-04-24 19:21:34
字体:
来源:转载
供稿:网友

一个实际应用的程序往往有多个模块、文件以及其它资源构成,为了清晰有效的组织这些程序,我们需要包来管理这些资源。Python中也支持包的概念。

Python的包是什么

Python包是存放程序模块和子包的文件夹,是包含若干子包和模块的命名空间。

每个包必须包含一个名为“__init__.py”的特殊文件,这个文件的内容可以为空,也可以包含导入模块的数据或信息。

包内可以存放的资源

如何创建一个包

在Python创建一个包可以分为两步:

(1)创建一个文件夹,并给这个文件夹一个合适的名字,文件夹的名字就是包的名字。

我们可以在操作系统准备创建包的目录中直接创建,也可以在Python的集成开发环境中进行创建。

(2)在这个文件夹中创建__init__.py文件,这样就把一个普通的文件夹转换成了Python包。这个文件用于初始化包并列出包的所有模块。也可以保持为空。

同样可以在一个包里创建一个或多个子包,每个包中都要包含__init__.py文件。

Python中创建包和使用自定义包

如何使用一个包

用户可以使用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(xy):
    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中导入了addsub两个方法,而没有导入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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表