python学习笔记 day21 包和异常

 

包: 一大堆模块的集合 

通俗的讲之前我们学序列化模块时,有个json 它其实是一个文件夹(里面有很多py文件),应该就算是一个包;

然后导入包的时候,.前面一定是一个包名,然后可以有两种方式 import 包名 或者 from 包 import 模块 (这种导入方式 包那块可以有. 但是import 后面必须是一个变量名,绝对不能有.

首先创建一系列文件夹(包)和文件(py文件 模块)

import os
os.makedirs('glance/api')  # 使用os.makedirs('filename1/filename2')创建文件夹
os.makedirs('glance/cmd')
os.makedirs('glance/db')
L=[]   # L中存放的是一系列文件句柄
L.append(open('glance/__init__.py','w'))
L.append(open('glance/api/__init__.py','w'))
L.append(open('glance/api/test1.py','w'))
L.append(open('glance/api/test2.py','w'))
L.append(open('glance/cmd/__init__.py','w'))
L.append(open('glance/cmd/test1.py','w'))
L.append(open('glance/db/__init__.py','w'))
L.append(open('glance/db/test1.py','w'))
map(lambda f :f.close(), L)  # 利用map()函数 主要是挨个从放着文件句柄的列表L中依次取值,然后传给lambda函数 关掉该文件

运行结果:

然后在api文件夹下的test1.py test2.py 文件,cmd文件夹下的test1.py 文件 和db文件夹下的test1.py 下面写相应的print()语句 或者定义函数~

然后进行各种方式的导入:

import glance.api.test1
glance.api.test1

或者这种方式:

import glance.api.test1 as test
test

或者:

from glance.api import test1
test1

运行结果:

再来看一下test2.py 的内容:

然后我们导入:

from glance.api import test2
test2.func()

或者:

from glance.api.test2 import func
func()

运行结果:

然后其他文件夹(包)的py文件(模块)的导入都跟上面的类似;

接下俩我们有一个新的需求就是在test.py(与glance文件夹位于同一级目录)中只写 import glance 就可以使用glance.api.test1 运行test1.py 文件 或者glance.api.test2.func()就可以运行api下面的test2.py中的func()函数~

这样应该怎么操作呢?

我们需要明确一点:导入包时,都是自动会运行该包下面的__init__.py文件!!!

先来验证一下这个操作:

然后我们导入 glance模块,看是否会运行glance包下面的__init__.py文件中的内容:

所以我们可以在相应包下面的__init__.py文件中做手脚,相当于联动触发,这一级出发下一级别:

我们先来看一下,在test.py中查看模块路径是什么样的:

运行结果:

所以相当于day06文件夹其实就是类似于根目录的样子~,不知道这样说对不对,反正就是test.py是在day06文件夹下嘛,所以相当于它的根目录直接就是day06 ,就是在test.py中导入模块时,优先从da'y06这个目录下面找有没有该模块,然后我们继续:

首先在glance包下面的__init__.py中写:

然后在 api 下面的__init__.py中:

另外两个也一样:

进行完上面的操作之后

当我们在test.py中导入glance后,我们就可以 直接拿着这个包名进行操作下面的任何一个文件了:

import glance
glance.api.test1
glance.api.test2.func()  # api下面的test2.py中定义了一个函数func
glance.cmd.test1
glance.db.test1

运行结果:

所以导入包的时候需要格外注意~

另外,当你直接导入py文件或者通过包.包 导入文件(只要最后导入的是py文件 ---模块)导入的那一刻就会运行该py文件的内容;

但是当你最后导入的是包时,它只会运行这个包下面的__init__.py这个是自动运行的~

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9652650.html