FreezeJ' Blog

pthon模块

2019-04-28

pthon模块

为什么使用模块?

  1. 代码重用
  2. 避免属性冲突

为了更好地组织和管理模块,python引入了包,在某个目录下添加模块__init__.py后,该目录就变成了包。目录支持嵌套,所以包也支持嵌套,包中还可以有子包。


相对导入

使用相对路径导入模块时,其中,一个.表示当前目录,两个..表示当前目录的父目录。当直接运行某个模块时,该模块就变成了主模块。主模块位于最顶层,与同目录下的其它模块无法形成相对关系。因此,当直接运行某个模块时,该模块不能相对导入。


import语句的执行流程

当使用import语句导入模块时,解析器会根据sys模块的modules属性值来查找模块是否已经导入了。

  1. 如果模块已经被导入,解析器不做任何操作。

  2. 如果模块没有被导入,

    (1)解析器按照某种路径搜索模块;

    (2)讲搜索到的模块编译为pyc字节码文件;(可选)

    (3)执行编译生成的字节码文件从而运行模块。

解析器搜索模块的路径:

import sys
from pprint import pprint
pprint(sys.path)

搜索路径主要由三部分组成:

  1. 当前目录
  2. 标准库目录
  3. 第三方库安装目录

修改解析器搜索模块的路径

  1. 直接修改sys.path,但是在代码运行后失效。
  2. 直接修改PYTHON_PATH

重新加载模块

当使用import导入模块之后,模块被修改,如果再次使用import导入模块,是不会生效的。

需要使用importlib中的reload()方法,重新加载模块。

import my_module, time
import importlib
for i in range(100):
    importlib.reload(my_module)  # 动态重新加载模块
    print(my_module.a)
    time.sleep(1)

模块访问控制

当某个模块前加单下划线_时,不能通过import *导入,但是可以通过import _xxx导入。

Tags: Python