模块导入

模块导入使用import语句,当解释器执行到import语句时, 若是在搜索路径中找到了指定的模块, 就会加载它
该过程遵循LEGB做用域原则, 若是在一个模块的顶层导入, 那么它的做用域就是全局的,若是在函数中导入, 那么它的做用域是局部的
若是模块是被第一次导入, 它将被加载并执行

当导入多个模块时,可以使用以下格式:
  1) import 模块1,模块2,模块3,...
  2) import 模块1
    import 模块2
    import 模块3
    ...
以上两种格式在性能上和生成 Python 字节代码时没有什么不一样,所以通常状况下, 使用多行导入,由于可读性高

以datetime为例,datetime是一个文件datetime.py,里面定义了一个叫datetime的类,这个类有一个方法叫作nowsocket

import 模块
  引入模块datetime,也就是文件datetime.py
  当使用该模块里的datetime类时,需这样写代码:datetime.datetime
  当使用该模块里的datetime类的now方法时,需这样写代码:datetime.datetime.now()

  注意:当import多个层级时,如import xx.xx.xx,最后的一个xx只能是package或者module,但绝对不能是函数或者类的名字
  如:import datatime.datatime 或者 import datatime.datatime.now是不能够的

import as
  有时导入的模块或是模块属性名称已在程序中使用了, 或不想使用导入的名字
  可以使用import as替换成本身想要的名字,一般把模块赋值给一个变量
    如:import datetime as dt

from import
  from import用于引入模块中的类,函数,变量
  from datetime import dateti  me 表示引入模块datetime也就是文件datetime.py中的datetime类函数

  当使用该模块里的datetime类时,需这样写代码:datetime
  当使用该模块里的datetime类的now()方法时,需这样写代码:datetime.now()
  datetime.datetime.now()会报错,所以经过from import方式导入模块内容时,若是当前代码中已有datatime属性,则属性就会被覆盖
  而经过import方式就不会,由于import方式是须要"模块名.属性"来引用的模块内容的,所以不会产生冲突

  from 模块 import *
    引入模块中的全部的公开成员,好比有些成员名带"_"或"__"的,它们是不会被引用的

  什么时候使用from import
    1) 目标模块中的属性很是多, 反复键入模块名很不方便 ,
      如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块 , 可能还有 socket 模块
    2) 交互解释器下, 由于这样能够减小输入次数性能

 

import和from import区别
  假设有模块A和模块B,在模块B中使用import和from import引入模块A

  使用importspa

  import A
  A.funcA() 
  #使用的funcA()依然是A模块的,虽然在模块B的代码中,但其命名空间依然是在模块A,若是对模块A的funcA()进行修改,是会影响到其在模块B的使用的

  使用from importcode

  from A import funcA
  funcA() 
  #funcA()已是A模块的funcA()了,该函数存在于模块B的全局命名空间,若是对模块A的funcA()进行修改,是不会影响到其在模块B的使用的

  所以,减小使用from xxx import XXX,特别是from xxx import * 这样的使用模式。后者将会污染全局命名空间blog