Python-45章 包

自定义包

从小到大

一个表达式 -> 一条语句 -> 语句块 -> 函数 ->类 -> 模块 -> 包 -> 一个项目
模块是一个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基础就结束了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章