Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123965
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-13 10:26
个人简介

- 毅力与勇气是事业的双飞翼; - 在尝试中成长,在失败中奋起。 - 概览 -> 细读 -> 概览 - 书不在多,在于精。

文章分类

全部博文(83)

文章存档

2016年(2)

2015年(6)

2014年(75)

我的朋友

分类: LINUX

2014-06-04 15:50:51



说明:

modules所在的目录在python里叫package, 下面是一个名为 IsDir的package(实际上就是一个目录), package下面有4个modules(A, B, C, D)和一个__init__.py文件,目录结构如下:

点击(此处)折叠或打开

  1. IsDir/
  2. A.py B.py C.py D.py __init__.py

大体来讲,有两种方法可以调用某目录下(包括递归目录)的modules.


一.  __init__.py为空时


1.1 以下为调用moduleA的代码:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. from IsDir import A
  3. A.say()
输出:

点击(此处)折叠或打开

  1. This is module
1.2 如果想调用moduleA,B,C,D呢?

方法1.

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. from IsDir import A
  3. from IsDir import B
  4. from IsDir import C
  5. from IsDir import D
  6. A.say()
  7. B.say()
  8. C.say()
  9. D.say()
方法2.

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. import IsDir.A
  3. import IsDir.B
  4. import IsDir.C
  5. import IsDir.D
  6. from IsDir import *
  7. A.say()
  8. B.say()
  9. C.say()
  10. D.say()


错误示例1:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. import IsDir.A
  3. A.say()

错误示例2:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. from IsDir import *
  3. A.say()

错误的原因: 

          IsDir/目录下__init__.py 为空时,直接import IsDir.A 或者from IsDir import *是无效的.

从官方文档里可以看到,__init__.py 里没有__all__ = [module1,module2,...]时,

from IsDir import * 只能保证IsDir被imported,  所以此时IsDir里的modules是无法被imported,
此时只有如我上面所写的代码所示才能正确执行,否则是错误的。官方解释为:import IsDir.A并无任何意义,只有接着执行from IsDir import *后,import IsDir.A语句里的module A才会被定义,所以完整的调用因改为: 1.  import IsDir.A   2. from IsDir import *。

二.   __init__.py用all=[...]指定该package下可以被imported进去的module


__init__.py里写入如下内容:

点击(此处)折叠或打开

  1. % cat IsDir/__init__.py
  2. __all__ = ["A","B"]

然后使用之:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. from IsDir import *
  3. A.say()
  4. B.say()

结果:

点击(此处)折叠或打开

  1. % python test.py
  2. This is module
  3. This is module

错误实例:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. from IsDir import *
  3. C.say()

以上示例之所以错误,是因为C并没有在__all__ = ["A","B"]里制定,由此可见,package IsDir下面的__init__.py里,__all__=[...]具有隔离modules的作用。

补充:

module A, B, C,D里我分别只定义了一个method, 例如,以下为module A的code:

点击(此处)折叠或打开

  1. % cat IsDir/A.py
  2. def say():
  3.   print "This is module A!"


转自:

阅读(453) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~