python中包是什么?有什么作用?python中包的介绍


本文摘自php中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于python中包是什么?有什么作用?python中包的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

1.什么是包?

包是一种通过".模块名"来组织python模块名称空间的方式.我们穿件的每个文件夹都可以被称为包.

但是要注意, 在python2中规定. 包内必须存在__init__.py文件.

创建包的目的不是为了运行, 而是被导入使用. 包只是一种形式而已,包的本质就是一种模块.

2.包的作用?

包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来,随着功能越写越多,我们无法将

所有功能都放在一个文件夹中,于是我们使用模块去组织功能,随着模块越来越多,我们就需要用文件夹将

模块文件组织起来,以此来提高程序的结构性和可维护性.

接下来创建一些包用来后面的学习.包很好创建,只需要一个文件夹,有__init__.py就可以了.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import os

os.makedirs('glance/api')

os.makedirs('glance/cmd')

os.makedirs('glance/db')

l = []

l.append(open('glance/__init__.py','w'))

l.append(open('glance/api/__init__.py','w'))

l.append(open('glance/api/policy.py','w'))

l.append(open('glance/api/versions.py','w'))

l.append(open('glance/cmd/__init__.py','w'))

l.append(open('glance/cmd/manage.py','w'))

l.append(open('glance/db/__init__.py','w'))

l.append(open('glance/db/models.py','w'))

map(lambda f:f.close() ,l)

创建好目录结构

我们给每个文件夹中添加一些方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#policy.py

def get():

    print('from policy.py')

     

#versions.py

def create_resource(conf):

    print('from version.py: ',conf)

     

#manage.py

def main():

    print('from manage.py')

     

#models.py

def register_models(engine):

    print('from models.py: ',engine)

我们在test.py中就可以使用包中的内容, 并且,我们导入包的时候可以使用import或者from xxx import xxx的形式

1

2

3

4

import glance.db.models

glance.db.models.register_models('mysql')

from glance.api.policy import get

get()

但是,注意:from xxx import xxx这种形式, import后?不可以出现"点" 也 就是说from a.b import c是ok的.

但是 from a import b.c 是错误的

3.__init__.py是干什么的?

不论我们使用哪种方式导入一个包, 只要是第一次导入包或者是包的任何其他部分, 都会先执行__init__.py文件.

这个文件可以是空的, 但是也可以存放一些初始化的代码.

那么我们之前用的from xxx import * 能用在包的调用上吗?

可以,我们要在__init__.py文件中给出__all__来确定*导入的内容.

1

2

3

4

5

6

7

8

print("我是glance的__init__.py?件. ")

x = 10

def hehe():

    print("我是呵呵")

     

def haha():

    print("我是哈哈")

__all__ = ['x', "hehe"]

test.py

1

2

3

4

from glance import *

print(x) # OK

hehe() # OK

haha() # 报错. __all__?没有这个?东?

4.相对导入和绝对导入

我们的最定级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种导入方式.

1).绝对导入:一glance作为起始

2). 相对导入: 用 . 或者 .. 作为起始

例如, 我们在glance/api/version.py中使?glance/cmd/manage.py

1

2

3

4

5

6

7

8

9

# 在glance/api/version.py

#绝对导?

from glance.cmd import manage

manage.main()

#相对导?

# 这种情形不可以在versions中启动程序.

# attempted relative import beyond top-level package

from ..cmd import manage

manage.main()

我们在测试的时候要注意,python包路径跟运行脚本所在的目录有关系.

在python中不允许你运行的程序导报的时候超过当前包的范围(相对导入).

如果使用绝对导入.没有这个问题.即,如果你在包内使用了相对导入.那在使用该包内信息的时候.只能在包外面导入

1

2

# 在policy.py

import versions

如果我们程序的入口时policy,那此时程序是没有任何问题的.但是如果我们在glance外面import了glance中的policy就会报错.

原因是如果在外面访问policy的时候.sys.path中的路径就是外面.所以根本就不能直接找到versions模块.所以一定会报错:

1

ModuleNotFoundError: No module named 'versions'

当我们导包出错的时候,一定要先看sys.path.看一下是否真的能获取到包的信息.

5.单独导入一个包

1

2

# 在test.py中

import glance

此时导入的glance什么做不了.因为在glance中的__init__.py中并没有关于子包的加载.此时我们需要在__init__.py中分别去引入子包中的内容.

1.使用相对路径

2.使用绝对路径

包的注意事项:

关于包相关的导入语句也分别为import和from xxx import xxx两种, 但无论使用哪种,无论在什么位置,在导入时都必须遵循一个原则: 凡是在导入时带点的,

点的左边都必须是一个包. 否则报错. 可以带一连串的点. 比如: from a.b.c import d

以上就是python中包是什么?有什么作用?python中包的介绍的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

60道Python面试题&答案精选!年后找工作必看

什么是Python脚本?

Python3获取当前文件的上一级目录实例

详解pycharm 自定义文件和代码模板实例

Python编程能做什么开发

Python多线程以及线程锁简单理解(代码)

Python常用运算符有哪些?

Python如何查看父类

Python怎么导入math库?

Python用什么软件好?Python开发工具推荐

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...