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中包的语法的更多相关文章

  1. 全面了解Python中的特殊语法:filter、map、reduce、lambda。

    这篇文章主要介绍了Python中的特殊语法:filter.map.reduce.lambda介绍,本文分别对这个特殊语法给出了代码实例,需要的朋友可以参考下filter(function, seque ...

  2. Python 中包/模块的 `import` 操作

    版权声明:博客为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/10745292.html 用实例来说明 import 的作用吧. 创建 ...

  3. Python中的基本语法

    #Python的基本语法: #1.了解缩进 #Python中没有{}来表示一个代码块,但是Python使用缩进来完成区别代码框架 #那么在Python中一个缩进一般等于4个空格,当然你也可以使用TAB ...

  4. Python中包(package)的调用方式

     一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有“__init__.py”这个文件就好了,如果有那么就是Pyt ...

  5. python中包和模块的使用说明

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...

  6. Python中的赋值语法

    Python中复制语法有6种 Basic Form >>>spam = 'spam' Tuple assignment >>>spam, ham = 'spam', ...

  7. Python 中 PyQt5 库语法(一)

    目录 PyQt5库(一) 一. 简介 1. 什么是 Qt 2. 什么是PyQt 3. 环境搭建 二. 基本结构 1. 第一个程序 2. 控件操作 3. 快速生成代码 4. 面向对象 三. 基类控件 1 ...

  8. 查看python中包的文档

    核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...

  9. Python中Swithch Case语法实现

    而python本身没有switch语句,解决方法有以下3种:A.使用dictionaryvalues = { value1: do_some_stuff1, value2: do_some_stuff ...

随机推荐

  1. 大数据权限管理工具 Apache Ranger 初识

    资料参考: Apache Ranger – Introduction http://ranger.apache.org/ 阿里云 Ranger简介 Apache Ranger初识 - 阿里云 大数据权 ...

  2. Caterpillar sis service information training and software

    Cat et sis caterpillar heavy duty truck diagnostics repair. Training demonstration allows.cat electr ...

  3. Python Selenium 常用方法总结

    selenium Python 总结一些工作中可能会经常使用到的API. 1.获取当前页面的Url 方法:current_url  实例:driver.current_url    2.获取元素坐标 ...

  4. Kali linux apt-get update 失败,无release……(最有效)

    设置源 编辑 /etc/apt/sources.list nano /etc/apt/sources.list 清空文件内所有内容后添加 deb http://mirrors.ustc.edu.cn/ ...

  5. FastStone Capture无法录制系统声音解决方法(win10)

    步骤一: 右键桌面-->个性化 步骤二: 主题-->高级声音设置 步骤三: 录音-->右键“立体声混音”,单击启用就OK了.

  6. eval & sleep

    ltp-ddt can_loopback source 'functions.sh'; interface='can0'; bitrate=; do_cmd "do_can_loopback ...

  7. Golang的值类型和引用类型的范围、存储区域、区别

    常见的值类型和引用类型分别有哪些? 值类型:基本数据类型 int 系列, float 系列, bool, string .数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变 ...

  8. P3369 【模板】普通平衡树(splay)

    P3369 [模板]普通平衡树 就是不用treap splay板子,好好背吧TAT #include<iostream> #include<cstdio> #include&l ...

  9. vs变量监视提示-VAR-CREATE: UNABLE TO CREATE VARIABLE OBJECT解决方法

    昨天有个linux应用在使用vs 远程debug的时候,debug可以正常进行,但是监视变量的时候提示-VAR-CREATE: UNABLE TO CREATE VARIABLE OBJECT,经测试 ...

  10. VS2012创建ATL工程及使用MFC测试COM组件

    一.创建ATL工程 1.创建ATL项目,取名为ATLMyCom 2.在ATL项目向导中,勾选[支持MFC](利用MFC测试用).[支持 COM+ 1.0],其余的选项默认,点击完成. 3.右键工程名称 ...