26.包

1.大纲

一.昨日内容回顾
1.re模块
findall()查找所有匹配的内容
finditer() 返回迭代器
search() 查找,查找到一个就返回
match() 匹配,从头匹配


sub() 根据正则替换
subn() 根据正则替换,返回替换的结果和替换的次数
split() 根据正则切割


compile() 对正则进行编译


2.模块
我们写的py文件就是一个模块
模块的引用
1.import 模块
2.from 模块 import XXX

加载模块的过程:
1.先去查看是否加载过该模块 顺序:内存->内置->sys.path
2.如果没有加载过,就开辟一个内存空间
3.执行该模块中的代码,所有产生的变量/类/函数都放在名称空间中
4.给名称空间命名,如果没有as用模块名作为名字,如果有as,则用
as后面的名字

import a,b,c一次导入多个模块

from 模块 import a,b,c as xxx

from XXX import *

2.今日内容大纲
1. from xxxx import *
从xxx导入所有. 如果模块内部有__all__ 导入all中的内容. 如果没有__all__全部都导入
2. 包
文件夹内包含了__init__.在导入包的时候, 默认执行__init__.py
查找的顺序: 内存 -> 内置 -> sys.path
sys.path有坑: 根据你启动的脚本所在的位置确定查找包, 模块的路径
sys.path.insert(0, "你想加入的位置")
1. 绝对路径
从sys.path找. 根
2. 相对路径
相对于当前文件所在文件夹
. 当前
.. 上一层
启动脚本不能在包内

预习:
网络编程
ip
tcp
udp

考试:
基础+函数+模块+面向对象
包不考
包的简介了解
在引入模块的时候 如果模块中没有写出__all__则默认所有的内容都导入,如果写了__all__此时导入的就是all列表里的内容
包
    包是一种通过'模块名'来组织python模块名称空间的方式。我们创建的每个文件夹都可以称为包
在py2中规定,包内必须存在__init__.py文件。创建包的目的不是为了运行,而是被导入使用,包是一种形式,
包的本质也是一种模块
    包的本质就是一个文件夹,文件夹唯一的功能就是讲文件组织起来,随着功能越写越多,无法将
所有的功能都放在一个文件夹中,于是用模块去组织功能,模块越来越多就需要使用文件夹将模块组织起来
以此来提高程序的结构性和可维护性。

创建多层文件

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)

测试的时候要在包的外层

# import glance.db.models
# glance.db.models.xxmodels()   #此时测试环境是在day26文件夹下

# from glance.api.policy import get
# get()   #
'''from xxx import xxx这种形式, import后面不可以出现"点"也就是说from a.b
import c 是ok的.但是from a import b.c是错误的'''

#     无论我们使用哪一种方式导入包,只要是第一次导入包或者是包的任何其它部分,都会先执行
# __init__文件,这个文件可以是空的,但也可以存放一些初始化代码(随意在glance中的
# 文件都可以测试)

绝对导入和相对导入

    最顶级的包glance是写给别人用的,然后在glance内部也会有彼此之间相互导入的需求
,这时候就有绝对导入和相对导入两种方式了
    1.绝对导入:以glance作为起始

import glance.cmd.manage
glance.cmd.manage.main()  #可以正常运行

    python包路径跟运行脚本所在的目录有关系,说简单点,就是运行的py文件所在的目录
,在python中不允许运行的程序导包的时候超过当前包的范围,如果使用绝对导入,则没有
这个问题, 如果你在包内使⽤用了相对导入. 那在使用该包内信息的时候. 只能在包外面导入.
程序的入口是在包的最外层的时候,sys.path是没有问题的
是不会报错的


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

单独导入一个包

需要在包内的每一个子包__init__进行引入子包中的内容

包的注意事项

1.关于包相关的导入语句也分为import 和 from xxx  import  xxx两种。但无论使用
哪种方式,无论在什么位置,在导入的时候都必须遵循一个原则,凡是在导入的时候带点
的(.)点左边都必须是一个包,否则报错,可以带一连串的点
2.import 导入文件时,产生的名称空间中的文字来源于文件,import包,产生的
名字包同样来源于文件,即包下的__init__.py 导入的本质就是在导入该文件
3.包A和包B下有同名的模块也不会冲突,如A,a,和B,a来自两个名称空间

sys.path

在哪运行,sys.path就是啥,根据启动的脚本所在的文件夹来确定sys.path,是随动的

cd..   上一个文件夹

cd.\(文件夹)  下一个文件夹

在包内使用相对路径,启动脚本就不能在这个包下,在包外面使用没有问题,在外面测试

 

完整的高级框架内,使用的大多是相对路径,用别人的框架,要用绝对路径

 

单独导入一个包
#
# 需要在包内的每一个子包__init__进行引入子包中的内容
#

 

































posted on 2018-10-22 17:32  小王子QAQ  阅读(36)  评论(0)    收藏  举报