包,模块

导入模块

 

1、import

2、__import__:

内置函数__import__ 可以动态导入模块,接受字符串作为参数

eg:

mod = __import__('os')         # 相当于import os as mod

func = getattr(mod,'walk')   # 通过反射获取

func()    # 相当于 os.walk()

 

 

3、包结构中__init__.py的作用:

从上边的例子可以看出,__init__.py的主要作用是:

1)、Python中package的标识,不能删除

2)、定义__all__用来模糊导入。

模糊导入中的*中的模块是由__all__来定义的,__init__.py的另外一个作用就是定义package中的__all__,用来模糊导入,如__init__.py:

__all__ = ["Pack1Class","Pack1Class1"]

3)、编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)

 

4、2个模块不要相互导入,这样会导致循环依赖,导入失败。可以创建一个中间位置存放公共变量。

5、通过相对路径导入模块:

  假设我们的项目目录结构如下所示:

test
├── a.py
├── b.py
└── __init__.py

0 directories, 3 files

  在a.py 中我们使用相对路径导入了b.py中的相关变量

  

from .b import c
print (c)

  当我们做以下2种操作时:

  1)、在test目录中执行python a.py 会报错提示导入失败

Traceback (most recent call last):
  File "a.py", line 1, in <module>
    from .b import c
ModuleNotFoundError: No module named '__main__.b'; '__main__' is not a packag

  这是因为使用了相对路径导入,而直接调用python a.py将导致它不能找到它的父目录. 我们需要跳出该项目所在的目录test, 在test目录外面的其它模块导入a即可, 

  那为什么不直接使用from b import c 这样的方式导入呢,这样也可以,这样在任何地方直接执行a.py都可以执行成功,但结果是你在test 外面其它的地方导入 a 将失败,这时它会在自己当前的搜索路径中去找,而test不在当前的搜索路径中。

 

posted @ 2016-10-26 16:49  andypengx  阅读(116)  评论(0编辑  收藏  举报