Python3基础-包

一 包介绍

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)

含有__init__.py文件的目录我们称之为包;文件内可以组织子模块或者子包
pythonscripts  #顶级包
| -- __init__.py      
|--lib                    #子包
|    |--__init__.py
|    |-- delete.py
|    |--add.py 
|---main.py    #子模块

注意:

  • python3 包没有__init__.py文件,import包仍然不会报错;
  • python2 包没有__init__.py文件,import包会报错
  • 创建包目的不是为了运行,还是被导入使用;
  • 包A和包B下有同名模块也不会冲突,如A.a 和B,a来自两个明明空间

 二 包导入

| -- __init__.py      
|--demo1                    #子包
|    |--demo1
|        |--demo2
|             |--demo3                
|                 |---cal.py文件
|---main.py    #子模块


#文件名:cal.py
def add(x,y):
    return  x+y

cal.py文件

def add_test(x,y):
    return  x+y

main.py文件调用cal.py文件

#方法1
from demo1.demo2.demo3.cal  import add_test
print(add_test(1,5))
"""
执行结果
5
"""
#方法2
from demo1.demo2.demo3 import cal
print(cal.add_test(1,5))
"""
执行结果
6
"""

# from demo1.demo2 import demo3 #执行web3 __init3__文件,唯一不支持的调用方式
# print(demo3.cal.add_test(1,5)) #报错AttributeError: module 'demo1.demo2.demo3' has no attribute 'cal'

=========================================================================================================================================================

web  #顶级包
| -- __init__.py      
|--lib                    #子包
|    |--__init__.py
|    |-- cal.py
|    |--request.py 
|---main.py    #子模块

#包内各文件内容
#main.py
def check():
    print("我是main函数")

#cal.py文件
def add(x,y):
    print("我是add的函数")
    return  x+y

#request.py
def get(data):
    print("我是get请求函数")
    return  data
#__init__.py文件内容均为空

1、绝对导入:以顶级包为起始

#test.py 文件和web 目录在相同的目录下
from web import main
main.check()
"""
执行结果
我是main函数
"""

2、相对导入

在Lib目录下的__init__.py 文件写入

#Lib目录下的__init__.py
from . import cal
#test.py 文件和web 目录在相同的目录下
from web import Lib

print(Lib.cal.add(1,2))
"""
执行结果
我是add的函数
3
"""

 

posted @ 2019-10-28 16:36  槑槑DE  阅读(137)  评论(0编辑  收藏  举报