多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 1. Python中的 __all__和__path__ 解析 Python以目录来组织模块, 就是所谓的包. 用包的一大好处: 可以解决名字空间冲突的问题, 即文件重名问题. 下面主要说3点: 1. 如何使一个目录变成包,如何import 目录下放一个__init__.py文件(内容可以为空), import包内模块的时候使用"."分割, 比如import Apackage.Amodule 2. __init__.py的__all__变量 __all__指定的是指此包被import * 的时候, 哪些模块会被import进来 3. __init__.py的__path__变量 __path__指定了包的搜索路径 下面是以举例的方法来介绍: ### 1.1 如何使一个目录变成包,如何import 在目录下, 放一个__init__.py文件, 这该目录会被认为包. __init__.py文件, 可以为空. 当一个包被import的时候, 会首先加载它的__init__.py文件(执行这个__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, 则: importSound.Utils.echo2. __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'] 则: >>>fromSoundimport* >>>dir() ['Effects','Filters','Utils','__builtins__','__doc__','__name__'] ### 1.2 __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__beforechange:['Sound/Utils'] Sound.Utils.__init__.__path__AFTERchange:['Sound/Utils/Linux','Sound/Utils'] I'm Linux.echo ~~~ 包和目录的区别是什么呢?