6. 模块

来源:互联网 发布:淘宝能买到恐怖水琴吗 编辑:程序博客网 时间:2024/05/16 12:00
模块
       将不同的定义(函数定义、变量定义...)放在不同的模块中, 可以显著减少单个模块的代码量, 而且 模块名.XXX 的引用方法能够避免不同模块间相同名称的定义混乱的情况.


包中可以包含子包, 也可以包含子模块

        为了让python将目录当作包, 目录中必须包含__init__.py文件,  官网说法是: " 这是为了避免了一个 含有烂俗名字的目录无意中隐藏了稍后在模块搜索路径中出现的有效模块, 比如 string" 
        对此, 我的理解是, 假设一个将要被当作包的目录被加入模块搜索路径中, 而这个目录中含有一个名为string的子目录, 显然, 这个会扰乱python解释器的视听, 因为这个string子目录并不是真正标准库自带的string模块.

使用 from package import item 方式导入包的时候, item既可以是包package的一个子包或子模块, 也可以是包中定义的其它命名, 如 函数. 类 , 变量等.

使用类似 import  item.subitem.subsubitem....lastSubitem 这样的语法的时候, 最后的子项("lastSubitem")必须是包或模块, 而不能是 其它命名, 如 函数, 类, 变量等.

其实, 个人觉得, 如果学习过Java中关于包的定义, 这些理解起来都是得心应手的.

从*导入包, 默认情况下, 会导入' * ' 号前的目录下的所有子目录(子包或模块或函数, 变量等).
如 from food import *
如果你想指定导入的子目录, 则可以在__init__.py中定义一个名为__all__的列表.
如:  __all__ = ['fruit' , 'vegetables']
则 from food import * 只会调入模块 fruit 和 vegetables

包内引用:
如果包中使用了子包结构, 可以按绝对位置从相邻的包中引入模块.
如:

food/
         fruit/
                  apple.py
                  banana.py
                  cherry.py
                  ...

         vegetables/
                  eggplant.py
                  potato.py
                  tomato.py
                  ...

如果vegetables的一个子包 coco, 即 food.vegetables.coco 要使用 fruit子包中的apple模块.  那么可以加入语句: from food.fruit import apple

也可以使用点标号的形式来代替.          . 代表当前目录     ..代表父目录

则上述导入语句可以更改为 from ..fruit import apple
0 0
原创粉丝点击