模块中的包的定义和使用

一.模块的搜索路径

模块的加载路径:内存==》内置模块==》sys.path(系统内置的环境变量,一系列自定义的模块)

import sys
print(sys.path) #查询系统的环境变量,以列表的形式进行存储
# 默认第一个元素就是当前被执行的文件目录


# 我们可以自定义的去加入系统的配置
sys.path.append(r'想导入的模块的绝对路径')
sys.path.insert(r'想导入的模块的绝对路径')   # 可以添加到指定的位置

二.模块导入的指定的流程

'''
导入模块的指令:
    -- 相对于 函数名() 调用函数体,函数调用会进入函数体,从上至下逐句解释执行函数体代码
    -- 导入模块,会进入模块文件,从上至下逐句解释执行模块文件代码
    -- 如果在模块中又遇到导入其他模块,会接着进入导入的模块,从上至下逐句解释执行文件中代码,依次类推
'''

三.循环导入

所谓的循环的导入,实质上就是模块之间形成的环状调用,就比如说,模块一中需要模块二中的变量名,反之,模块二需要模块一的变量名,这就是循环导入。

循环导入会存在很多问题:

      1.-- 导入模块是要使用模块中的变量

      2.-- 正常逻辑都是在文件最上方先完成对模块的导入,再在下方定义自身模块变量,以及使用导入的模块中的变量

      3.-- 由于导入模块的特殊机制,第一次导入模块会编译执行导入的模块,也就是会进入模块逐句执行模块内容,再次导入只是使用内存中的名字
      4.-- 就会出现下面的情况,m2在使用m1中的变量x,但变量x却并未产生,这就出现了循环导入问题

列如:

m1.py文件
import m2
x = 10
print(m2.y)

m2.py文件
import m1
y = 10
print(m2.x)


# 针对循环导入的问题,我们可以采用延迟导入的方式来处理。
#       1.将循环导入的包中的变量名进行提前定义,再导入到相应的包中
#       2.将导入包的路径提前封装在一个函数中,保证在逻辑函数的调用在变 
#          量定义之后    

“”“
重点:
问题:from导包极容易出现循环导入问题
解决:建议from导入方式改用import导入方式
“””

四.包的认识

包通过文件夹来管理一系列功能的相近的模块。

包:是一系列的模块的集合体。包中一定要有专门管理包的所有模块的文件。

包名:是存放一系列模块的文件夹名字,包名是存放的是管理模块的那个文件的地址,指向的是全局名称空间

五.包的导入

#  包的导入实质上是通过查找环境变量的绝对地址来完成导入的。


# 要注意的是:
          1.导入的包的文件夹必须添加到环境变量里
          2.导入的文件夹名就是包名

# 在导入包的文件夹中一定有__init__.py文件

六.导入模块和导入包相应完成的三件事

# 导如模块完成的三件事:
    1.编译执行模块module.py文件,并相应的生成__pycache__文件。
    2.在该模块中产生相应的global的全局名称空间
    3.在该模块的全局名称空间中产生相应的一个变量名称空间


# 导入包完成的三件事:
    1.编译执行包中的__init__.py文件,会在包中__pycache__创建对应的 
       pyc文件
    2.产生__init__.py文件的全局名称空间,用来存放__init__出现的名字
    3.产生包名指向__init__.py文件的全局名称空间 | 指定变量名指向包中指 
      定名字

七.模块的导入之import

'''
注意点:
1.在包__init__.py中不建议使用import导入
2、在包__init__.py中不建议使用as起别名
总结:不建议__init__.py中采用import管理名字 ==> 空着不写

在使用文件中
直接在要使用的文件中用import一层层找到你想要的名字
import 包名.文件名 as 别名

# 起完别名,原名不可以再使用
原名:包名.文件名 => 包名.文件名.变量名
别名:别名 => 别名.变量名

'''

八.包中的模块导入之绝对路径

# 在包的__init__文件中
import 模块名  # 问题:所属包不在环境变量,报错
import 包名.模块名  # 问题:包所属文件夹不在文件变量,报错
import 包名.模块名 as 别名  # 在外界:包名.模块名 | 包名.别名 都可以访问
import 包名.模块名.名字  # 问题:导包语句.语法左侧必须全部是包(文件夹)


# 外界
import 包名
包名.名字  # 访问的是__init__中的名字
包名.模块  # 访问的模块这个地址
包名.模块.名字  # 访问的模块中的名字

import 包名.模块
包名.模块  # 访问的模块这个地址
包名.模块.名字  # 访问的模块中的名字

from 包名 import 模块
模块  # 访问的模块这个地址
模块.名字  # 访问的模块中的名字

from 包名.模块 import 名字
名字  # 访问的模块中的名字

九.包中导入模块之相对路径

# 没有子包
''' 1)
pk包
    -- __init__.py
        -- 名字 a = 10
    -- pkm.py
        -- 名字 b = 20
    
在外界
import pk
pk.a 访问a
pk.b 访问b

init管理文件
a不需要操作
from .pkm import b

'''

# 有子包

''' 1)
pk包
    -- __init__.py
    sub子包
        -- __init__.py
            名字 x = 10
        -- subm.py
            名字 y = 10
    
在外界
import pk
pk.x 访问x
pk.y 访问y

在pk的init管理文件
from .sub import x
from .sub.subm import y
'''

''' 2)
pk包
    -- __init__.py
    sub子包
        -- __init__.py
            名字 x = 10
        -- subm.py
            名字 y = 10
    
在外界
import pk
pk.sub.x 访问x
pk.sub.y 访问y

在pk的init管理文件:要产生sub名字
from . import sub  => pk.sub

在sub的init管理文件:要产生x,y名字
x不需要操作  => pk.sub.x
from .subm import y  => pk.sub.y

'''

# 注:有相对导入.语法的文件都不能自执行

posted on 2019-04-09 19:34  程序小王的生命周期  阅读(262)  评论(0编辑  收藏  举报

导航