__all__
2016-07-09 18:42
246 查看
关于python的pakage和module __all__ __path__的介绍
http://tiffanylam2010.blog.163.com/blog/static/17078035120116250553238/ython以目录来组织模块, 就是所谓的包. 用包的一大好处: 可以解决名字空间冲突的问题, 即文件重名问题.
下面主要说3点:
1. 如何使一个目录变成包,如何import
目录下放一个__init__.py文件(内容可以为空), import包内模块的时候使用"."分割, 比如import Apackage.Amodule
2. __init__.py的__all__变量
__all__指定的是指此包被import * 的时候, 哪些模块会被import进来
3. __init__.py的__path__变量
__path__指定了包的搜索路径
下面是以举例的方法来介绍:
1. 如何使一个目录变成包,如何import
在目录下, 放一个__init__.py文件, 这该目录会被认为包. __init__.py文件, 可以为空. 当一个包被import的时候, 会首先加载它的__init__.py文件, 一般可以在__init__.py文件中进行初始化. 需要用到包中模块,import的时候使用"."分割.比如:
Sound/ 包
|-- Effects Sound的一个子包
| |-- __init__.py
| |-- errors.py
| `-- iobuffer.py
|-- Filters Sound的一个子包
| |-- __init__.py
| |-- dolby.py
| |-- equalizer.py
| |-- karaoke.py
| `-- vocoder.py
|-- Utils Sound的一个子包
| |-- __init__.py
| |-- echo.py
| |-- reverse.py
| `-- surround.py
`-- __init__.py 文件夹下放一个__init__.py文件, 则此文件夹为包
需要用到Sound/Utils/echo.py, 则:
import Sound.Utils.echo
2. __init__.py的__all__变量
__all__: __init__.py的常用变量__all__指定的是指此包被import * 的时候, 哪些模块会被import进来.
举例:
Sound/__init__.py是一个空文件, 则:
>>> from Sound import *
>>> dir()
['__builtins__', '__doc__', '__name__']
在Sound/__init__.py中, 写一行:
__all__ = ['Effects', 'Filters', 'Utils']
则:
>>> from Sound import *
>>> dir()
['Effects', 'Filters', 'Utils', '__builtins__', '__doc__', '__name__']
3. __init__.py的__path__变量
__path__: __init__.py的常用变量__path__, 默认情况下只有一个元素, 就是当前包的路径, 修改__path__, 可以修改此包内的搜索路径.举例:
在Utils下增加2个目录Linux和Windows, 并各有一个echo.py文件, 目录如下
Sound/Utils/
|-- Linux 目录下没有__init__.py文件, 不是包, 只是一个普通目录
| `-- echo.py
|-- Windows 目录下没有__init__.py文件, 不是包, 只是一个普通目录
| `-- echo.py
|-- __init__.py
|-- echo.py
|-- reverse.py
`-- surround.py
三个echo.py的文件内容如下:
ltt@hz171-14:~/tmp$ cat Sound/Utils/echo.py
print "I'm Sound.Utils.echo"
ltt@hz171-14:~/tmp$ cat Sound/Utils/Windows/echo.py
print "I'm Windows.echo"
ltt@hz171-14:~/tmp$ cat Sound/Utils/Linux/echo.py
print "I'm Linux.echo"
Sound/Utils/__init__.py是空文件,则结果如下:
>>> import Sound.Utils.echo
I'm Sound.Utils.echo
把Sound/Utils/__init__.py改成:
import sys
import os
print "Sound.Utils.__init__.__path__ before change:", __path__
dirname = __path__[0]
if sys.platform[0:5] == 'linux':
__path__.insert( 0, os.path.join(dirname, 'Linux') )
else:
__path__.insert( 0, os.path.join(dirname, 'Windows') )
print "Sound.Utils.__init__.__path__ AFTER change:", __path__
则结果如下:
>>> import Sound.Utils.echo
Sound.Utils.__init__.__path__ before change: ['Sound/Utils']
Sound.Utils.__init__.__path__ AFTER change: ['Sound/Utils/Linux', 'Sound/Utils']
I'm Linux.echo
相关文章推荐
- Multiply Strings
- ubuntu12.04 gcc和g++支持 c++11特性
- iOS学习(二十一)Objective-C SEL和IMP类型
- java冒泡排序和选择排序
- 【记录】PWM
- poj 3279 Fliptile(搜索)
- Linux 上安装Gearman及其PHP扩展
- 将XML文件写入数据库中
- JavaEE中利用JAXB来实现Java对象和XML文档进行相互转换
- javaweb网站get方式url传值中文汉字乱码问题
- Python 函数 (教程 2)
- sql语句中GROUP BY 和 HAVING的使用 count()
- php的日期时间函数
- 【BZOJ1806】[Ioi2007]Miners 矿工配餐【DP】
- arcgis api for javascript 4.0 入门学习(2)创建一个3D地图
- NKOI 1344 人力资源管理
- js使用正则表达式
- FJ省队集训最终测试 T2
- DNS与bind
- java面向对象的体现下篇