自定义包
从小到大
一个表达式 -> 一条语句 -> 语句块 -> 函数 ->类 -> 模块 -> 包 -> 一个项目
模块是一个py文件,包可以装多个模块,包就是文件夹
包内可以写很多个模块,
代码
首先创建所需环境
# # 创建目录及文件
# import os
# os.makedirs('glance/api')
# os.makedirs('glance/cmd')
# os.makedirs('glance/db')
# l = []
# l.append(open('glance/__init__.py','w'))
# l.append(open('glance/api/__init__.py','w'))
# l.append(open('glance/api/policy.py','w'))
# l.append(open('glance/api/versions.py','w'))
# l.append(open('glance/cmd/__init__.py','w'))
# l.append(open('glance/cmd/manage.py','w'))
# l.append(open('glance/db/__init__.py','w'))
# l.append(open('glance/db/models.py','w'))
# map(lambda f:f.close() ,l)
#import glance.api.policy # 此时调用会非常麻烦,只写目录名会报api不存在错误
import glance
glance.api.policy.shui()
# 在glance 中的init文件写入 from glance import api ,然后再api目录下的init文件写入 from glance.api import policy ,此时调用成功
# 如果在api下的init直接写入import policy,如果api/init是启动文件不会报错并可以正常运行,但是外面(当前文件)会报错找不到模块名policy
import sys
print(sys.path) # 查看模块搜索路径
# 启动文件所在位置,决定了sys.path的路径,以当前运行目录为根目录
绝对导入和相对导入
----------# 启动文件----------
import glance
glance.api.policy.shui()
# 此时运行成功.在policy中也可以运行
----------#policy文件:----------
# 绝对导入 从根开始 sys.path
#一般是比较安全的,
#导入manager文件中的dong
from glance .cmd import manage
def shui():
manage.dong()
print("刘老六喜欢睡觉")
----------#manage文件:----------
def dong():
print("动物会动")
----------# glance/init文件:----------
from glance import api
----------#api/init文件----------
from glance.api import policy
相对导入
----------# 启动文件----------
import glance
glance.api.policy.shui()
# 此时运行成功
----------#policy文件:----------
# 相对导入
# ..表示上一次, . 表示本层
from ..cmd import manage
def shui():
manage.dong()
print("刘老六喜欢睡觉")
----------#manage文件:----------
def dong():
print("动物会动")
----------# glance/init文件:----------
from glance import api
----------#api/init文件----------
from glance.api import policy
---------- 此时启动文件依旧可以正常运行,但是policy文件运行失败
ImportError: attempted relative import with no known parent package
翻译:试图用相对导入超过了当前文件所在包
# 相对导入一定要在外面启动,项目框架这么写(但是这好像是架构师的事)
import导入
---------- policy文件----------
from . import versions
def shui():
manage.dong()
versions.ver()
print("刘老六喜欢睡觉")
# 此时policy依旧不能运行,启动文件可以
查找路径sys.path是根据启动文件位置来定
import导入文件时,产生名称空间中的名字来源于文件,import包,产生的名称空间中的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
包A和包B下有同名模块也不会冲突,如A.a和B.a来自两个名称空间
至此,Python基础就结束了.