码迷,mamicode.com
首页 > 其他好文 > 详细

9_模块_包导入

时间:2020-07-20 15:30:23      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:模块开发   版本   列表   多个   不用   xxx   安装过程   后缀名   python   

模块
一、模块

1、模块定义
模块:将一些定义存放在文件中,为一些脚本或者交互式的解释器实例使用。

模块包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。

2、好处
a、提高了代码的可复用,可维护性,一个模块编写完后可以方便在其他项目中使用。
b、解决了命名冲突,不同模块相同的命名不会冲突。

3、自定义模块
定义.py包含:变量定义,可执行语句,for循环,函数定义等等,这些统称为模块的成员。
自定义模块被其他模块导入时,其中的可执行语句会立即执行

4、模块的运行方式
脚本方式:直接用解释器运行,pycharm右键运行。
模块方式:被其他的模块导入,为其它模块提供资源(变量、函数定义、类定义)。

5、__name__判断模块开发阶段还是使用阶段
python提供一中判断自定义模块是属于开发阶段还是使用阶段:
脚本方式运行时,福鼎的字符串:main
以模块导入的方式运行就是本模块的名字。

二、模块搜索

1、模块搜索路径
当你导入一个模块,解析器对模块位置的搜索顺序是:
a、当前目录
b、如果不在当前目录,Python则搜索内置路径(安装路径中/Lib/ 中搜索)。
c、如果都找不到,Python会查看默认路径 sys.path

如果三个都没找到会报错。

2、sys.path
import sys.path
模块搜索路径存储在system模块的sys.path变量中,变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录,由sys模块的sys.path方法来规定。

sys.path返回的数据类型是列表
a、列表可以修改、我们导入的范围也可以通过修改sys.path这个列表获得暂时的修改。例如通过
sys.path.append()添加目录,导入额外目录的模块。

动态修改sys.path
os.path.dirname():获取某个路径的父路径。通常用于获取当前模块的相对路径

import os
os.path.dirname(file) # 获取模块的父路径
sys.path.append(os.path.dirname(file) + ‘模块名‘)

b、列表是有序的,当搜索的过程当中,在第一个路径下搜索到了,就停止搜索。而且sys.path第一个路径是脚本的当前路径。

禁止将自定义脚本命名成模块的名称。自定义模块命名不能和系统的模块名称相同。

三、导入模块的多种方式

1、import 模块名
导入一个模块的所有成员
模块名.变量,模块名.函数,模块名.类

import 模块名,模块名... : 导入多个模块的成员(不建议)。

2、from 模块名 import 变量/函数/类
从模块中带入指定的成员
在代码中可以直接使用变量,函数,类

3、from 模块名 import *
导入模块中所有的成员
但是如果想限制获取的内容,可以在模块中使用__all__=[使用*可以访问到内容]

4、import和from的区别

a、无论是import还是from的形式,都会将模块内容进行加载
b、from导入,使用其中成员时,不用使用模块名作为前缀,直接使用,不容易产生命名冲突
import导入,必须使用模块名作为前缀,容易产生命名冲突。
可以使用别名解决 from 模块名 import 变量/函数/类 as a

c、from 模块import * : 表示可以使用模块里的所有内容,没有定义__all__可以全部访问,定义__all__则只能访问all里的内容
from 包import * : 表示包中的内容(模块)不能访问,需要在__init__.py文件中定义__all__,all = [“想访问的模块”]

四、包的导入

1、包 :文件内含有__init__.py文件的就叫做包,别的模块导入包时都会默认执行__init__.py

2、导入包的多种方式
import 包名

from 包名 import 变量/函数/类
包名可以带点 .,但点( .)的前面必须是包名,import后不能带点

五、相对导入
针对某个项目的不同模块之间进行导入,成为相对导入
格式:
from 相对路径 import xxx
相对路径:包含了点号的相对路径
. :表示的是当前的路径
.. :表示的是父路径
... :表示的是父路径的父路径

六、循环导入
大型的Python项目中,需要很多的Python文件,由于架构不当,可能会出现模块之间的相互导入
A:模块
def test():
f()
B:模块
def f():
test()

避免产生循环导入
1、重新架构(不推荐)
2、将导入语句放入函数里面
3、将导入语句放入模块的最后

.pyc临时文件
为了提高加载模块的速度,python解释器会在__pycache__目录中下缓存每个模块编译后的版本,之后,再次被导入时,实际上导入的是这个.pyc的临时文件。

9_模块_包导入

标签:模块开发   版本   列表   多个   不用   xxx   安装过程   后缀名   python   

原文地址:https://www.cnblogs.com/q121211z/p/13344872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!