from语句

例一、

  1. from pathlib import Path,PosixPath
  2.  
  3. print(dir())
  4. print(Path)
  5. print(PosixPath)
  6.  
  7. 运行结果:
  8. ['Path', 'PosixPath',...]
  9. <class 'pathlib.Path'>
  10. <class 'pathlib.PosixPath'>

  Path和PosixPath是pathlib模块中定义的类,使用 "from .. import .."语句可以直接映射pathlib模块中的资源在当前的命名空间。接下来就可以使用资源名直接调用,不需要再以"pathlib.Path" 这样的完整资源层次关系调用。

例二、

  1. from pathlib import Path,PosixPath
  2. import pathlib.Path
  3.  
  4. print(dir())
  5. print(Path)
  6. print(PosixPath)
  7. print(pathlib.Path)
  8.  
  9. 运行结果:
  10. Traceback (most recent call last):
  11. File "C:/python/1207.py", line 2, in <module>
  12. import pathlib.Path
  13. ImportError: No module named 'pathlib.Path'; 'pathlib' is not a package

  

包的简单概念:
包必须是目录,且此目录下有一个__init__.py,比如下面的层级关系:

|--包

|--__init__.py
   |--子模块.py
   |--子模块
      |--子模块.py

包下面可以有多个嵌套的子模块,后面会单独一篇文章介绍包。

模块必须是一个文件夹或者单独的以py结尾的文件,比如下面的层级关系:
|--os
   |--path.py

上面的树状文件路径中os是一个顶级模块,path是os模块下的一个子模块。

再看下pathlib的层级关系:
|--pathlib.py
   |--class Path(PurePath)
上面的pathlib就是一个单独的顶级模块,Path只是这个模块中的一个类,并不是一个模块,所以import pathlib.Path 直接导入时会抛出 No module named 'pathlib.Path' 异常。

如果需要直接导入模块里面的资源就必须使用 from 模块 import 资源名 的格式,下一个例子就会介绍这种格式。

例三、

  1. from pathlib import * #导入模块下的所有"公共"资源
  2.  
  3. print(dir())
  4. print(Path.cwd())
  5. 运行结果:
  6. ['Path', 'PosixPath', 'PurePath', 'PurePosixPath', 'PureWindowsPath', 'WindowsPath', ...]

  

通过前一个例子的异常,我们知道import 无法直接导入顶级模块或子模块中的资源(类,方法,属性),使用 from .. import * 语句(第一种方法)就会将指定模块下的所有资源导入,或者指定资源名的格式导入部分资源: from .. import 资源(第二种方法) ,这两种方法都会将资源同名映射到当前命名空间。
第二种方法相比第一种方法的好处是,只导入需要的资源,其它用不到的资源通通不导入,可以节省内存,这是一种好的编程习惯,在程序效率上任何微小的提升积累起来都是大的提升。

本例子中特别强调了 from .. import * 导入的是模块下的所有”公共“资源,公共资源也就是不以单下划线(_xx)或者双下划线(__yy__)开头的资源。

例四、

  1. from os import path as osp #别名
  2. print(dir())
  3.  
  4. 运行结果:
  5. ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'osp']

  在导入子模块或者资源时也可以使用as 语句重命名子,当前命名空间最终保存的就是重命名后的映射。

例五、

  1. from os.path import exists
  2.  
  3. print(dir())
  4. if exists('c:/windows'):
  5. print('found')
  6. else:
  7. print('not found')
  8.  
  9. 运行结果:
  10. ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'exists']
  11. found

  当前例子中使用了 from 包.模块 import 子模块 的格式,说明from语句后的模块可以是完整层级关系下的模块(依然有一个找模块、加载模块、初始化模块的过程),也可以是单独的模块,最终当前加入命名空间的依然是子模块名的映射。

例六、

  1. from os.path import exists
  2.  
  3. print(dir())
  4. print(exists)
  5.  
  6. import os
  7. print(dir())
  8. print(os.path.exists)
  9. print(os.path.__dict__['exists'])
  10.  
  11. 运行结果:
  12. ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'exists']
  13. <function exists at 0x000001F7AEDAC268>
  14. ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'exists', 'os']
  15. <function exists at 0x000001F7AEDAC268>
  16. <function exists at 0x000001F7AEDAC268>

  

当前例子中先后使用不同的导入方式,导入path模块的exists函数,最终比较内存地址时,按道理说前后调用的方式是不一样的,却发现内存地址是一致的。
模块加载机制中可能有一种在当前环境中防止重复导入模块的机制,下一篇文章再做介绍。

总结:

1. from 语句需要指定模块,模块可以是单独的顶级模块,也可以是层级关系下的子模块,加载并初始化该模块

2. import 语句后指定的是该模块的资源(类,方法,函数),或者导入该模块下的子模块。

先查找导入的模块是具有该名称的属性 -->如果没有,就尝试导入为该名称的子模块 --> 如果还没有找到,就抛出ImportError异常。下一篇文章也会举例介绍该模块搜索顺序。

如果该名称后有as语句,则关联as语句后的名称到当前名词空间

Python 模块化 from .. import 语句介绍 (二)的更多相关文章

  1. Python 模块化 from .. import 语句资源搜索顺序 (三)

    接着上一篇文章最后的import子句资源搜索顺序,我们来写几个例子了解下. 例一. #test1.py x = 123 #test.py import test1 print(dir()) print ...

  2. Python中的import语句

    Python中的import语句是导入一个文件,这条语句主要做三件事: 1 通过一定的方式,搜寻要导入的文件: 2 如果需要,就编译这个文件: 3 运行这个文件 但是,需要注意的是,所有这三个步骤,都 ...

  3. python爬虫之requests库介绍(二)

    一.requests基于cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们 ...

  4. Python中from … import …语句

    from - import -语句可以让你从模块中导入一个指定的部分到当前模块

  5. Python 模块化 import 语句介绍(一)

    用法: import 模块1[,模块2,模块3...] os 顶级模块os.path 非顶级模块as 相当于重命名 import 的本质: 解释器负责模块单独加载,单独初始化,生成一个模块对象,当前作 ...

  6. python nose测试框架全面介绍二

    二.基本使用 nosetest脚本的使用(在安装完nose之后) nosetests [options] [(optional) test files or directories] 我们可以使用配置 ...

  7. Python import语句导入模块语法[转]

    Python import语句导入模块语法 社区推荐:掘金是国内最活跃的技术社区,我们每日有优质Python开发实例分享,海量python开源库推送.来掘金,和更多懂技术的小伙伴交流.   pytho ...

  8. Python编程基础[条件语句if 循环语句 for,while](二)

    ython条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 判断条件: 执行语句……else: 执行语句…… x= ...

  9. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

随机推荐

  1. File类的常用方法和练习

    File类常用的判断方法 import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /** * Fi ...

  2. Spark内部结构详解

    参考: https://github.com/JerryLead/SparkInternals/blob/master/markdown/english/5-Architecture.md?winzo ...

  3. linux的目录结构及文件基本操作

    1. linux的文件组织目录结构 linux的目录与window的区别 win以存储介质为主,主要以盘符及分区实现文件 管理,再下面才是目录. linux以树形目录结构的形式来构造整个系统,每一个目 ...

  4. JSON转换和序列化的区别

    序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据.将对象的状态信息转换为可以存储或传输的窗体的过程. 在序列 ...

  5. Web前端面试指导(十六):为什么要初始化CSS样式?

    题目点评 这个题目乍一看感觉怪怪的,什么叫初始化样式了?如果换一句话你可能就理解了,就是通用样式.这道题目主要涉及的是理论方面的知识,不用写代码,只要描述清楚就可以了 初始化样式的原因 因为浏览器的兼 ...

  6. 浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异[转]

    看的文章来自: https://blog.coding.net/blog/the-difference-between-throttle-and-debounce-in-underscorejs 使用 ...

  7. osgEarth编译——以VS2012为例

    整理记录下 osgEarth编译过程. osgEarth是依赖于OSG的三维地理平台. 准备工作 OpenSceneGraph-3.4.0.zip OSG_3RDPARTY_DIR    http:/ ...

  8. Android中使用异步线程更新UI视图的几种方法

    在Android中子线程是不能更新ui的. 所以我们要通过其他方式来动态改变ui视图, 1.runOnUiThreadactivity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要 ...

  9. git命令图

  10. [转]实现Hive数据同步更新的shell脚本

    引言: 上一篇文章<Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表>http://www.linuxidc.com/Li ...