python基础知识——包

包是一种通过使用“模块名”来组织python模块的名称空间的方式。

无论是import形式还是from...import形式,凡是在导入语句中(不是在使用时)遇到带点的,就需要意识到——这是包。

包是目录级的,文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)。

import导入文件时,产生名称空间中的名字来源于文件,import包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件。

在python3中,即使包下没有__init__.py文件,import包仍然不会报错,而在python2中,包下一定要有该文件,否则import包报错。

[root@7 module]# tree
.
├── bonf  #
│?? ├── __pycache__
│?? │?? └── test1.cpython-36.pyc  #导入的时候生成的缓存文件
│?? └── test1.py 模块
└── conf   #
    ├── __pycache__
    │?? ├── test2.cpython-36.pyc
    │?? └── test1.cpython-36.pyc
    ├── test2.py   #模块
    └── test.py  #模块

4 directories, 6 files

#包中的内容
#!/usr/bin/env python
def func1():      #bonf包下模块test1中有个func1函数
    print("bonf")
                                                               
~                                                                       
"bonf/test1.py" 3L, 50C    

#另一个包conf
#!/usr/bin/env python
def func1():    #包conf下模块test1下函数func1
    print("函数1")
                                                            
~                                                                       
"conf/test1.py" 3L, 53C      

现在来导入这两个包

>>> import bonf.test1
>>> import conf.test1  #没有报错

现在来引用其中的函数

>>> bonf.test1.func1()
bonf
>>> conf.test1.func1()  #没有毛病
函数1

我们可以看到,两个包下有同名的模块也不会冲突,它们来自各自的命名空间。

也是可以使用from-import,但是这样会覆盖命名空间。

>>> from conf import test1
>>> test1.func1()
函数1

>>> from bonf import test1
>>> test1.func1()
bonf

多层也是可以的

>>> import bonf.donf.test10
>>> donf.test10.func()   #少一层都不行,路径要对
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'donf' is not defined
>>> bonf.donf.test10.func()
2层

相对导入和绝对导入

>>> from bonf import test1  #绝对
>>> from . import test1    #相对

 

posted @ 2017-11-26 03:37  明王不动心  阅读(519)  评论(0编辑  收藏  举报