包的import      

      只要一个文件夹下面有个 __init__.py 文件,那么这个文件夹就可以看做是一个包。包导入的过程和模块的基本一致,只是导入包的时候会执行此包目录下的 __init__.py 而不是模块里面的语句了。另外,如果只是单纯的导入包,而包的 __init__.py 中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。

例如:
有下面的包结构:
PA
|---- __init__.py
|---- wave.py
|---- PB1
       |---- __init__.py
       |---- pb1_m.py
|---- PB2
        |---- __init__.py
        |---- pb2_m.py 

有如下程序:

import sys
import PA.wave                 #1
import PA.PB1                  #2
import PA.PB1.pb1_m as m1      #3
import PA.PB2.pb2_m            #4
             
PA.wave.getName()              #5
m1.getName()                   #6
PA.PB.pb2_m.getName()          #7

1) 当执行 #1 后,sys.modules 会同时存在 PA、PA.wave 两个模块,此时可以调用 PA.wave 的任何类或函数了。但不能调用 PA.PB1(2) 下的任何模块。当前 Local 中有了 PA 名字。

2) 当执行 #2 后,只是将 PA.PB1 载入内存,sys.modules 中会有 PA、 PA.wave、PA.PB1 三个模块,但是 PA.PB1 下的任何模块都没有自动载入内存,此时如果直接执行 PA.PB1.pb1_m.getName() 则会出错,因为 PA.PB1 中并没有 pb1_m 。当前 Local 中还是只有 PA 名字,并没有 PA.PB1 名 字。

 3) 当执行 #3 后,会将 PA.PB1 下的 pb1_m 载入内存,sys.modules 中会有 PA、PA.wave、PA.PB1、PA.PB1.pb1_m 四个模块,此时可以执行 PA.PB1.pb1_m.getName() 了。由于使用了 as,当前 Local中除了 PA 名字,另外添加了 m1 作为 PA.PB1.pb1_m 的别名。

 4) 当执行 #4 后,会将 PA.PB2、PA.PB2.pb2_m 载入内存,sys.modules 中会有 PA、PA.wave、PA.PB1、PA.PB1.pb1_m、PA.PB2、PA.PB2.pb2_m 六个模块。当前 Local 中还是只有 PA、m1。

      下面的 #5,#6,#7 都是可以正确运行的。

 

参考资料:http://blog.csdn.net/zbyufei/article/details/5894645

posted on 2020-11-02 15:16  amanlikethis  阅读(373)  评论(0编辑  收藏  举报