Chinaunix首页 | 论坛 | 博客
  • 博客访问: 533037
  • 博文数量: 174
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 1827
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-15 14:12
文章分类

全部博文(174)

文章存档

2018年(1)

2017年(1)

2013年(3)

2012年(9)

2010年(12)

2009年(5)

2008年(106)

2007年(37)

我的朋友

分类: Python/Ruby

2008-12-26 11:57:42

Python模块包中__init__.py文件的作用

http://hi.baidu.com/nkhzj/blog/item/a6f0df00b2c39716728b65f1.html

模块包:

包通常总是一个目录,目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。差不多就像这样吧:

Package1/ __init__.py

Module1.py

Module2.py

Package2/ __init__.py

Module1.py

Module2.py

我们可以就这样导入一个包:

import Package1

或者调入一个子模块和子包:

from Package1 import Module1

from
Package1 import Package2

import
Packag1.Module1

import
Packag1.Package2

可以深入好几层包结构:

from Package1.Package2 import Module1

import
Package1.Package2.Module1

大致就这样吧,我觉得,包的精髓应该是在 __init__.py 这个文件之中的。



__init__.py 文件:

__init__.py 控制着包的导入行为。假如 __init__.py 为空,那么仅仅导入包是什么都做不了的。

>>> import Package1

>>>
Package1.Module1

Traceback (most recent call last):
File "", line 1, in ?
Package1.Module1

AttributeError: 'module' object has no attribute 'Module1'

我们需要在 __init__.py 里把 Module1 预先导入:

#文件 __init__.py

import
Module1

测试:

>>> import Package1

>>>
Package1.Module1

'Module.pyc'>

__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:

from PackageName import *

这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:

#文件 __init__.py

__all__ = ['Module1', 'Module2', 'Package2']

测试:

>>> from Package1 import *

>>>
Module2

__init__.py 文件会在导入时被执行。

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