python中包的语法
1.什么是包?
包是一种通过".模块名"来组织python模块名称空间的方式.我们穿件的每个文件夹都可以被称为包.
但是要注意, 在python2中规定. 包内必须存在__init__.py文件.
创建包的目的不是为了运行, 而是被导入使用. 包只是一种形式而已,包的本质就是一种模块.
2.包的作用?
包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来,随着功能越写越多,我们无法将
所有功能都放在一个文件夹中,于是我们使用模块去组织功能,随着模块越来越多,我们就需要用文件夹将
模块文件组织起来,以此来提高程序的结构性和可维护性.
接下来创建一些包用来后面的学习.包很好创建,只需要一个文件夹,有__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)
创建好目录结构

我们给每个文件夹中添加一些方法:
#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的形式
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__来确定*导入的内容.
print("我是glance的__init__.py⽂件. ")
x = 10
def hehe():
print("我是呵呵")
def haha():
print("我是哈哈")
__all__ = ['x', "hehe"]
test.py
from glance import * print(x) # OK
hehe() # OK
haha() # 报错. __all__⾥没有这个⻤东⻄
4.相对导入和绝对导入
我们的最定级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种导入方式.
1).绝对导入:一glance作为起始
2). 相对导入: 用 . 或者 .. 作为起始
例如, 我们在glance/api/version.py中使⽤glance/cmd/manage.py
# 在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中不允许你运行的程序导报的时候超过当前包的范围(相对导入).
如果使用绝对导入.没有这个问题.即,如果你在包内使用了相对导入.那在使用该包内信息的时候.只能在包外面导入
# 在policy.py
import versions
如果我们程序的入口时policy,那此时程序是没有任何问题的.但是如果我们在glance外面import了glance中的policy就会报错.
原因是如果在外面访问policy的时候.sys.path中的路径就是外面.所以根本就不能直接找到versions模块.所以一定会报错:
ModuleNotFoundError: No module named 'versions'
当我们导包出错的时候,一定要先看sys.path.看一下是否真的能获取到包的信息.
5.单独导入一个包
# 在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中的特殊语法:filter、map、reduce、lambda。
这篇文章主要介绍了Python中的特殊语法:filter.map.reduce.lambda介绍,本文分别对这个特殊语法给出了代码实例,需要的朋友可以参考下filter(function, seque ...
- Python 中包/模块的 `import` 操作
版权声明:博客为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/10745292.html 用实例来说明 import 的作用吧. 创建 ...
- Python中的基本语法
#Python的基本语法: #1.了解缩进 #Python中没有{}来表示一个代码块,但是Python使用缩进来完成区别代码框架 #那么在Python中一个缩进一般等于4个空格,当然你也可以使用TAB ...
- Python中包(package)的调用方式
一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有“__init__.py”这个文件就好了,如果有那么就是Pyt ...
- python中包和模块的使用说明
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...
- Python中的赋值语法
Python中复制语法有6种 Basic Form >>>spam = 'spam' Tuple assignment >>>spam, ham = 'spam', ...
- Python 中 PyQt5 库语法(一)
目录 PyQt5库(一) 一. 简介 1. 什么是 Qt 2. 什么是PyQt 3. 环境搭建 二. 基本结构 1. 第一个程序 2. 控件操作 3. 快速生成代码 4. 面向对象 三. 基类控件 1 ...
- 查看python中包的文档
核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...
- Python中Swithch Case语法实现
而python本身没有switch语句,解决方法有以下3种:A.使用dictionaryvalues = { value1: do_some_stuff1, value2: do_some_stuff ...
随机推荐
- tensorflow学习5----GAN模型初探
生成模型: 通过观测学习样本和标签的联合概率分布P(X,Y)进行训练,训练好的模型能够生成符合样本分布的新数据,在无监督学习方面,生成式模型能够捕获数据的高阶相关性,通过学习真实数据的本质特征,刻画样 ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...
- Python+OpenCV图像处理(十一)—— 图像金字塔
简介:图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构.简单来说,图像金字塔就是用来进行图像缩放的. 进行图像缩放可以用图像金字塔,也可以使用 ...
- Delphi 如何访问监控摄像头?
源: Delphi 如何访问监控摄像头?
- shell 脚本的时间差计算
在某个时间点上增加一段时间 将时间转为时间戳,然后增加时间 [root@~]# date +%s -d '2017-05-27 12:0:0' 1495857600 [root@ ~]# new_ti ...
- Prometheus监控学习笔记之Prometheus监控简介
0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...
- vue中的指令v-model
Vue的指令:其实就是单个JavaScript表达式,一般来说是带有v-前缀:都有着对应的官网介绍:https://cn.vuejs.org/v2/guide/forms.html v-model:数 ...
- spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)
spring boot 入门 关于版本的选择,spring boot 2.0开始依赖于 Spring Framework 5.1.0,而spring 5.x和之前的版本差距比较大,而且应该来说还没有广 ...
- Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定
Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...
- mvc 前端校验
首先解决 Ajax.BeginFor异步提交表单,给表单添加样式的问题.不能直接用class属性,网上找了很多都是用ClassName,经过测试不管用,看源代码发现生成的是ClassName而非cla ...