Python Day27

 

1、模块:

 

模块的定义

  模块就是一个py文件  调用一个模块的时候会自动运行这个模块

注意:     一个模块不会被导入多次
          不要在同一行 导入多个模块
 导入顺序    内置模块---第三方模块---自定义模块
 模块的 命名空间 --- 有单独的命名空间

   导入模块的时候 会创建一个模块的命名空间
  把里面的名字都绑定到自己的命名空间
重命名 可以 import my_module as mm 给模块重命名

 json -- pickle 操作都一样--可以把名字
 mysql---oracle ---sql
 只导入指定的方法  from .. import ..as .. 只导入指定的方法

   多个导入  from my_module import (read1 as read,
                                     read2 as read2,
                                      money as m)
 from... import *   ---- 不用加模块名 模块中的名字不要和文件里的冲突
 print(dir()) # 查看自己导入的模块
 import math ---- from math import pi (节省)---- from math import math
 模块里面 导入的模块 可以被使用  ---  一次导入 后便倒入的模块中也可以 使用这个模块
 *  --   __all__=[]  约束 *
  import sys ----  print(sys.modules) --当前引入的所有模块
  模块第一次导入的时候 已经放在内存里
 第一次导入
          import my_module 时 生成 pyc 编译文件 字节码
          第一次导入的时候 耗时间
          python -m my_module.py  强行生成pyc
 sys.path---找模块路径---丛路径找模块
     sys.modules --当前引入的所有模块
  __name__ ---  __main__  只在自己作为脚本的时候执行
                              用做脚本测试时  if __name__=='__main__'

    def login():       print('ads')

    if __name__=='__main__':       login()
 dir(模块) --- 把模块的名字全部显示出来

 

2、包:

 

模块的定义

  模块就是一个py文件  调用一个模块的时候会自动运行这个模块

注意:     一个模块不会被导入多次
          不要在同一行 导入多个模块
 导入顺序    内置模块---第三方模块---自定义模块
 模块的 命名空间 --- 有单独的命名空间

   导入模块的时候 会创建一个模块的命名空间
  把里面的名字都绑定到自己的命名空间
重命名 可以 import my_module as mm 给模块重命名

 json -- pickle 操作都一样--可以把名字
 mysql---oracle ---sql
 只导入指定的方法  from .. import ..as .. 只导入指定的方法

   多个导入  from my_module import (read1 as read,
                                     read2 as read2,
                                      money as m)
 from... import *   ---- 不用加模块名 模块中的名字不要和文件里的冲突
 print(dir()) # 查看自己导入的模块
 import math ---- from math import pi (节省)---- from math import math
 模块里面 导入的模块 可以被使用  ---  一次导入 后便倒入的模块中也可以 使用这个模块
 *  --   __all__=[]  约束 *
  import sys ----  print(sys.modules) --当前引入的所有模块
  模块第一次导入的时候 已经放在内存里
 第一次导入
          import my_module 时 生成 pyc 编译文件 字节码
          第一次导入的时候 耗时间
          python -m my_module.py  强行生成pyc
 sys.path---找模块路径---丛路径找模块
     sys.modules --当前引入的所有模块
  __name__ ---  __main__  只在自己作为脚本的时候执行
                              用做脚本测试时  if __name__=='__main__'

    def login():       print('ads')

    if __name__=='__main__':       login()
 dir(模块) --- 把模块的名字全部显示出来

 

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。

就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。

不妨假设你想设计一套统一处理声音文件和数据的模块(或者称之为一个"包")。

现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。

并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所你还需要一组怎么也写不完的模块来处理这些操作。

这里给出了一种可能的包结构(在分层的文件系统中):

sound/                          顶层包
      __init__.py               初始化 sound 包
      formats/                  文件格式转换子包
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  声音效果子包
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  filters 子包
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

从一个包中导入*

设想一下,如果我们使用 from sound.effects import *会发生什么?

Python 会进入文件系统,找到这个包里面所有的子模块,一个一个的把它们都导入进来。

但是很不幸,这个方法在 Windows平台上工作的就不是非常好,因为Windows是一个大小写不区分的系统。

在这类平台上,没有人敢担保一个叫做 ECHO.py 的文件导入为模块 echo 还是 Echo 甚至 ECHO。

(例如,Windows 95就很讨厌的把每一个文件的首字母大写显示)而且 DOS 的 8+3 命名规则对长模块名称的处理会把问题搞得更纠结。

为了解决这个问题,只能烦劳包作者提供一个精确的包的索引了。

导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。

 

作为包的作者,可别忘了在更新包之后保证 __all__ 也更新了啊。你说我就不这么做,我就不使用导入*这种用法,好吧,没问题,谁让你是老板呢。这里有一个例子,在:file:sounds/effects/__init__.py中包含如下代码:

__all__ = ["echo", "surround", "reverse"]

这表示当你使用from sound.effects import *这种用法时,你只会导入包里面这三个子模块。

如果 __all__ 真的没有定义,那么使用from sound.effects import *这种语法的时候,就不会导入包 sound.effects 里的任何子模块。他只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)。

这会把 __init__.py 里面定义的所有名字导入进来。并且他不会破坏掉我们在这句话之前导入的所有明确指定的模块。看下这部分代码:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

 

posted @ 2017-09-21 19:54  大象和骆驼  阅读(204)  评论(0编辑  收藏  举报