Python有两种导入包和模块的方式,区别如下

form...import... import
相对导包 导入不同包子模块
可以导入模块所需变量/函数/类  
init文件的__all__特殊变量(模块列表)  
   
   
   
import 语句
import_stmt ::= "import" module ["as" identifier] ("," module ["as" identifier])*
| "from" relative_module "import" identifier ["as" identifier]
("," identifier ["as" identifier])*
| "from" relative_module "import" "(" identifier ["as" identifier]
("," identifier ["as" identifier])* [","] ")"
| "from" module "import" "*"
module ::= (identifier ".")* identifier
relative_module ::= "."* module | "."+
基本的 import 语句(不带 from 子句)会分两步执行: 查找一个模块,如果有必要还会加载并初始化模块。 在局部命名空间中为 import 语句发生位置所处的作用域定义一个或多个名称。 当语句包含多个子句(由逗号分隔)时这两个步骤将对每个子句分别执行,如同这些子句被分成独立的 import 语句一样。 第一个步骤即查找和加载模块的详情 导入系统 一节中有更详细的描述,其中也描述了可被导入的多种类型的包和模块,以及可用于定制导入系统的所有钩子对象。 请注意这一步如果失败,则可能说明模块无法找到,或者 是在初始化模块,包括执行模块代码期间发生了错误。 如果成功获取到请求的模块,则可以通过以下三种方式一之在局部命名空间中使用它: 如果模块名称之后带有 as,则跟在 as 之后的名称将直接绑定到所导入的模块。 如果没有指定其他名称,且被导入的模块为最高层级模块,则模块的名称将被绑定到局部命名空间作为对所导入模块的引用。 如果被导入的模块 不是 最高层级模块,则包含该模块的最高层级包的名称将被绑定到局部命名空间作为对该最高层级包的引用。 所导入的模块必须使用其完整限定名称来访问而不能直接访问。 from 形式使用的过程略微繁复一些: 查找 from 子句中指定的模块,如有必要还会加载并初始化模块; 对于 import 子句中指定的每个标识符: 检查被导入模块是否有该名称的属性 如果没有,尝试导入具有该名称的子模块,然后再次检查被导入模块是否有该属性 如果未找到该属性,则引发 ImportError。 否则的话,将对该值的引用存入局部命名空间,如果有 as 子句则使用其指定的名称,否则使用该属性的名称 例如: import foo # foo imported and bound locally
import foo.bar.baz # foo.bar.baz imported, foo bound locally
import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb
from foo.bar import baz # foo.bar.baz imported and bound as baz
from foo import attr # foo imported and foo.attr bound as attr
如果标识符列表改为一个星号 ('*'),则在模块中定义的全部公有名称都将按 import 语句所在的作用域被绑定到局部命名空间。 一个模块所定义的 公有名称 是由在模块的命名空间中检测一个名为 __all__ 的变量来确定的;如果有定义,它必须是一个字符串列表,其中的项为该模块所定义或导入的名称。 在 __all__ 中所给出的名称都会被视为公有并且应当存在。 如果 __all__ 没有被定义,则公有名称的集合将包含在模块的命名空间中找到的所有不以下划线字符 ('_') 打头的名称。 __all__ 应当包括整个公有 API。 它的目标是避免意外地导出不属于 API 的一部分的项(例如在模块内部被导入和使用的库模块)。 通配符形式的导入 --- from module import * --- 仅在模块层级上被允许。 尝试在类或函数定义中使用它将引发 SyntaxError。 当指定要导入哪个模块时,你不必指定模块的绝对名称。 当一个模块或包被包含在另一个包之中时,可以在同一个最高层级包中进行相对导入,而不必提及包名称。 通过在 from 之后指定的模块或包中使用前缀点号,你可以在不指定确切名称的情况下指明在当前包层级结构中要上溯多少级。 一个前缀点号表示是执行导入的模块所在的当前包,两个点号表示上溯一个包层级。 三个点号表示上溯两级,依此类推。 因此如果你执行 from . import mod 时所处位置为 pkg 包内的一个模块,则最终你将导入 pkg.mod。 如果你执行 from ..subpkg2 import mod 时所处位置为 pkg.subpkg1 则你将导入 pkg.subpkg2.mod。 有关相对导入的规范说明包含在 包相对导入 一节中。 importlib.import_module() 被提供用来为动态地确定要导入模块的应用提供支持。 引发一个 审核事件 import 附带参数 module, filename, sys.path, sys.meta_path, sys.path_hooks。

官方文档看来看去还是没有直接说两个导包的区别,倒是说了使用方式的不同,导包时处理方法也不同,最后看完还是觉得莫名其妙。。。

Python form...import...和import的区别(自己理解的)的更多相关文章

  1. python中import和from-import的区别

    . import导入模块的路径两种方式 # 将模块所在路径再程序中添加到sys.path列表中 import sys sys.path import导入模块按照sys.path顺序依次查找,“”代表当 ...

  2. python 模块导入import和import from区别

    模块就是一个.py文件,在名字空间下导入模块导入import和import from,那么python 模块导入import和import from区别是什么呢 1,import 导入模块 impor ...

  3. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块)   一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...

  4. python中from module import * 的一个陷阱

    from module import *把module中的成员全部导到了当前的global namespace,访问起来就比较方便了.当然,python style一般不建议这么做,因为可能引起nam ...

  5. @import和link的区别

    @import和link的区别 1.link语法结构    <link href="CSSurl路径" rel="stylesheet" type=&qu ...

  6. python:Attempted relative import in non-package

    problem:Attempted relative import in non-package 所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“ ...

  7. #import和#include的区别 关键字@class的作用

    一.#import和#include的区别当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误但是使用两次#import的话,不 ...

  8. export,import ,export default区别

    export,import ,export default区别 一.export,import ,export default ES6模块主要有两个功能:export和import export用于对 ...

  9. import()、import语句、require() 区别

    import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要是后者为动态加载. import() 与 import语句 区别 区别项 import() import语句 参数都 ...

  10. from module import 和 import 的区别

    最近在用codecademy学python,遇到一些题目错误,小小记录一下 如from math import sqrt是把sqrt作为本文件的方法导入进来了,使用的时候只需要直接调用sqrt. 而如 ...

随机推荐

  1. Linux安装Python xlrd、xlwt、xlutils模块

    一.安装setuptools: 可以先打开setuptools的python官网看看setuptools软件包如何安装: 1 > wget https://bitbucket.org/pypa/ ...

  2. HTTP攻击与防范-PHP客户端脚本攻击

    实验目的 了解客户端脚本植入攻击的方式 掌握防范攻击的方法 实验原理 了解客户端脚本植入攻击的方式 掌握防范攻击的方法 实验内容 了解客户端脚本植入攻击的方式 掌握防范攻击的方法 实验环境描述 1. ...

  3. [题解]UVA10129 Play on Words

    链接:http://vjudge.net/problem/viewProblem.action?id=19492 描述:单词接龙 思路:求欧拉回路或欧拉道路. 首先建图,以字母为节点,单词为边.因为单 ...

  4. 号称BI商业智能界的“四大天王”

    基于云部署的现代商业智能与数据分析平台(国内似乎只有应用上云,数据本地化的趋势)正在逐步占据主流市场.随着市场在易用性和增强分析(augmented analytics)的变革,数据与分析领导者正在逐 ...

  5. 国产BI报表工具中低调的优秀“模范生”——思迈特软件Smartbi

    首先简单来介绍一下这位低调且优秀的模范生--思迈特软件Smartbi.思迈特Smartbi是企业级商业智能BI和大数据分析品牌,满足用户在企业级报表.数据可视化分析.自助分析平台.数据挖掘建模.AI智 ...

  6. 【C# IO 操作】使用StringWriter和StringReader的好处

    当你有一组应用程序接口(API)只允许用Writer或Reader作为输入,但你又想使用String,这时可以用StringWriter或StringReader. 假设有下面这样一个process方 ...

  7. 【C# 基础概念】静态常量和动态常量的区别

    C# 静态常量和动态常量的区别 C#中有两种常量类型分别为readonly(运行时常量)与const(编译时常量),readonly是变量的常量,const是字面量的常量本文将就这两种类型的不同特性进 ...

  8. Python常用内建模块和第三方库

    目录 内建模块 1  datetime模块(处理日期和时间的标准库) datetime与timestamp转换 str与datetime转换 datetime时间加减,使用timedelta这个类 转 ...

  9. kube-scheduler源码分析(2)-核心处理逻辑分析

    kube-scheduler源码分析(2)-核心处理逻辑分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作 ...

  10. Pycharm:控制台输入输出In Out变为<<<

    Setting中取消勾选'Use IPython if aviable'