[Python]Python中的包(Package)
参考官方文档中的Module和Glosssary中的描述。
Module: https://docs.python.org/3/tutorial/modules.html#packages
Glossary: https://packaging.python.org/glossary/#term-module
更通俗的理解参考:
什么是Module?
在说明Package之前,首先需要介绍Python中的模块(Module)。
模块是Python中实现代码复用的基本单元。
可以简单理解为一个py文件就是一个模块。如用户在echo.py文件中定义了echo()函数, 用户可以在hello.py文件中调用echo模块中的echo()函数,实现代码复用。
不过实际上模块还分为纯模块(Pure Module)与扩展模块(Extension Module).
纯模块用Python编写并保存在单独的.py文件中(可能会关联.pyc或.pyo文件), 如上面举的echo.py的例子。
扩展模块是用比Python的更底层语言实现的功能,如C/C++/Java写的底层扩展。这些扩展通常包含在一个可动态载入的预编译文件中,如Unix下的.so文件(Shared Object), Windows下的DLL文件(使用.pyd扩展名)。
什么是Package?
pacakge可认为是模块的集合,是python文件的归档。 Python将含__init__.py的文件夹视为一个包。
细究起来分为本地包(Import Package)和正式发布的包(Distribution Package)。两者都简称为package。
Import Package也是一个Python模块,只是该模块中递归的包含了其他的模块或package,简单理解为一组文件的归档。
而Distribution Package是在网上发布的package。与本地package不同,Distribution的包除了包含其他包/模块之外,还包含与包发布相关的其他资源文件,并带有版本号。
包的载入过程
包也是Python构造模块命名空间的一种方式,用户通过".module-name"来进行调用变量。比如A.B表示B是A包的一个子模块。
通过使用模块,用户不必担心模块中的变量名会与全局变量名冲突, 也不用担心不同的模块变量名相同的冲突。
以一个叫做sound的模块为例,假设sound模块含以下结构:
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
当载入包时,Python通过sys.path下列出的路径来查找包的子文件夹。
Python会将包含__init__.py的文件夹视为包。这样做是为了避免在文件夹取了一个通用名之后, 如string,导致搜索路径下后面同名文件夹被无意覆盖(?)。如sys.path下含/root/string. 如果string下有__init__.py文件,则认为其为一个Python包进行导入。如果不含, 则认为其为一个搜索路径,Python会搜索该路径下的其他文件夹,看是否有需要导入的模块。__init__.py可以是一个空文件,什么都不写,也可以执行一些初始化的操作或设置__all__变量。
用户通过import导入包:
import sound.effects.echo
导入sound.effects.echo子模块后,必须通过全名才能引用该模块:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
也可以这样引用子模块:
from sound.effects import echo
echo.echofilter(input, out, delay=0.7, atten=4)
也可以直接导入函数或变量:
from sounds.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
导入的时候,import语句首先验证对象是否在包中定义。如果包中未定义对象,则认为该对象是一个模块,并尝试载入。载入失败则抛出ImportError异常。
[Python]Python中的包(Package)的更多相关文章
- 解析Python编程中的包结构
解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...
- python学习日记(包——package)
简述——包 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 注意: 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都 ...
- [18/11/28]Java中的包(package)
一.为何引入包? 包机制是Java中管理类的重要手段. 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理. 包对于类,相当于文件夹对于文件的作用.(同一文件 ...
- python学习笔记013——包package
1 包(模块包)package 1.1 包的定义 包是将模块以文件夹的组织形式进行分组管理的方法 1.2 作用 分类管理,有利于防止命名冲突 可以在需要时加载一个或部分模块,而不是全部模块 mypac ...
- C#中的命名空间namespace与Java中的包package之间的区别
Java 包被用来组织文件或公共类型以避免类型冲突.包结构可以映射到文件系统. System.Security.Cryptography.AsymmetricAlgorithm aa; 可能被替换: ...
- java 中的包概念
Java 中的包package, 就是电脑中的文件夹.我们平时在工作中,文件太多时,都会新建文件夹进行分类管理,java 中的包也是类似的道理,当我们的类太多时,也需要进行分类管理,这时我们就会把类文 ...
- ## Python中的Package和Jupyter中import包问题
前言 关于python包的一些知识 Java中的package概念 我们知道在java中的import package概念, java中的包就是一个目录,里面包含着子目录,子目录套着子目录,当需要引入 ...
- Python入门之PyCharm中目录directory与包package的区别
对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清 ...
- python入门-PyCharm中目录directory与包package的区别及相关import详解
一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dict ...
随机推荐
- gantt project 使用
市场上有不少项目计划类系统, 很多都是收费的, 还有很多都是web版, 这些都自然被排除了. 免费好用的还真不多, 今天简单介绍一下 gantt project 这个软件, 开源并且免费, 基于 ja ...
- js关于“call方法”百度,阿里超难面试题
面试题:function fn(a,b){ console.log(this); console.log(a); console.log(a+b);}fn.call(1);fn.ca ...
- python3抓图学习-百度贴吧
# coding=utf-8 from bs4 import BeautifulSoup import urllib.request import os import time def downlao ...
- HTML基础之JS中的字符转义--转义中文或特殊字符
1.在标准的url的规范中是不允许出现中文字符或某些特殊字符的,所以要进行转义 2.& 代表参数的链接,如果就是想传& 给后端那么必须转义 decodeURI(url) URl中未转义 ...
- Linux命令--tree
目录 tree 最常用 带颜色显示2级目录 排除显示某个目录 tree tree -C :颜色显示 tree -f : 显示文件全路径 tree -L 2 :只显示2层 tree -P *.pl :只 ...
- solr7.5--win10--部署使用
2018年8月份学习使用solr,当时下载的版本是solr7.5,写这篇博文的时候是2019年3月份,solr此时已经出到了8.0版本.一个大版本的变迁肯定有很多的改动,暂时还未研究就不赘述了. 此篇 ...
- 97w网站邀请码
我是一个老粉丝了. 如果想要97w网站邀请码可以留下联系方式,给我发过去哦. 最好是邮箱. http://www.97w.net/tag.html
- linux文件常用命令
文件管理不外乎文件或目录的创建.删除.查询.移动,有mkdir/rm/mv 2.1. 创建和删除 创建:mkdir 删除:rm 删除非空目录:rm -rf file目录 删除日志 rm *log (等 ...
- 生成透视列之for xml path
临时表#t原始数据: 实现如下格式,即根据Province分组,把每个组对应的City列以某种格式展示: 实现方法: select t.Province,(select city+',' From # ...
- js数据结构与算法——字典与散列表
<script> //创建字典 function Dictionary(){ var items = {}; this.set = function(key,value){ //向字典添加 ...