import my_module # 要导入一个.py文件的名字,但是不加.py 后缀名。
import my_module # 模块的名字(和别的py文件的区别)必须要满足变量的命名规范。
一般情况下,模块的名字都是小写字母开头的名字
模块名最后被当做一个变量名被使用
import XXX as X
-
1.找到这个模块,
-
2.创建一个属于XXX的内存空间
-
3.执行XXX
-
4.将XXX这个模块所在的命名空间建立一个和XXX之间的引用关系
import 这个语句相当于什么???
- import这个模块相当于执行了这个模块所在的py文件
模块可以被多次导入吗?
- 一个模块不会被重复导入(不是不能,虽然支持重复导入多次模块,不会执行多次)
如何使用模块?
- 导入多个模块可以在一行,但是在PEP8规范里面要求分行导入
- 所有的模块的导入都要尽量放在文件的开头。
模块的代入也是有顺序的:
-
先导入内置的模块
-
再导入第三方模块
-
再导入自定义模块
import my_module # 要导入一个.py文件的名字,但是不加.py 后缀名。
import my_module # 模块的名字(和别的py文件的区别)必须要满足变量的命名规范。
一般情况下,模块的名字都是小写字母开头的名字
模块名最后被当做一个变量名被使用
import XXX as X 只是改了内存里面引用的变量,不是改了模块的名字
模块
模块的分类?
内置模块
- 安装python解释器的时候跟着安装上的那些方法(C:\Program Files (x86)\Python37-32\Lib)
第三方模块/扩展模块
- 没在安装python解释器的时候安装的那些功能 。(C:\Program Files
(x86)\Python37-32\Lib\site-packages)
自定义模块
- 你自己写的功能,如果是一个通用的功能,那你就把它当做一个模块
什么是模块?
-
有的功能开发者无法完成,这样的话,需要借助已经实现的函数/类来完成
-
你实现不了的功能都有别人替你实现了
比如:
-
和操作系统打交道
-
和时间打交道
-
1000取随机数(算法)
-
压缩一个文件
-
和网络通信
模块就是别人写好的具有相同功能一组功能。文件夹/py文件/C语言编译好的一些编译文件
-
分类管理方法
-
节省内存
-
提供更多的功能
为什么要用模块
-
节省内存
-
分类管理方法
-
提供更多的功能
模块怎么用?在哪用?
__del__方法
-
在清除一个对象,在内存中使用的时候
-
会触发这个对象所在的类中的析构方法
item系列
对象要想要用[],就需要实现item系列
-
getitem obj[“XXX”]
-
setitem obj[“XXX”] = ZZZ
-
delitem del obj["XXX]
__hash__方法
-
1.在同一次执行中,相同的值的hash值总是一样的
-
2.能实现set的去重
-
3.字典的快速查找
o__eqal__
-
==
-
set的去重
模块
模块的分类
-
1.内置的
-
2.扩展的/第三方的
-
3.自定义的,.py文件
import 文件名
- 文件名:要求和变量名的要求一致
- 模块不会被多次导入
- 模块的导入相当于执行了这个文件
- 模块有自己独立的命名空间
重命名 as
导入多个模块
-
一行导入多个,逗号隔开 不建议使用
-
多行导入多个:内置,第三方,自定义的顺序
from my_module import login的时候发生了什么?
- 找my_module模块
- 开辟一块属于这个模块的命名空间
- 执行这个模块
任然相当于执行了整个py文件
导入了什么,就能使用什么,不导入的变量不能使用
不导入并不意味着不存在
而是没有建立文件到到模块中其他名字的引用
当模块中导入的这个方法或变量和本文件中重名的时候,这个名字只代表最后一次对它赋值的那个方法或者变量
在本文件中对全局变量的修改是完全不会影响模块中的变量的引用的
重命名:
- from my_module import login as l 就相当于l指向了人家的login,再调用login的时候,就用l调用就行
导入多个:可以是方法,可以是变量
- from my_module import login,name
导入多个再重命名
- from my_module import login as l,name as n
from my_module import *
- my_module里面所有的方法和变量在本文件中都有一个同名的引用
看__all__
-
所有的名字都是字符串类型的
-
模块相关的其他知识
把模块当脚本运行:从本模块中反射本模块中的变量
运行一个py文件的两种方式
-
1.以模块的形式运行
import my_module
-
2.直接pycharm运行,cmd运行
以脚本的形式运行 那么需要在本文件中直接打印的代码上加上if __name__ == "__main__":
在编写python文件的时候
所有不在函数和类中的封装的内容都应该写在
if name == “main”:下面
(在pycharm下面,直接打main,按tab)
pyc编译文件
当一个文件,作为一个脚本被导入的时候,就会在这个文件所在目录的__pycache__下生成一个编译好的文件,为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以节省一些导入的时间
重新加载模块
-
只要已经导入了,被导入的代码逻辑,在更改也没有用了
-
导入的行为,不会随着文件的改变而改变(import imaplib # 表示重新加载,开发的时候不会用到)
import aaa
import time
import imaplib
aaa.login()
time.sleep(20)
aaa.login() #意思就是在等待的20秒内,可以改变login里面的逻辑在import之后,再修改这个导入的模块,程序是感知不到的,reload这种方式强制在重新导入这个模块一次,非常不推荐使用
从本模块中反射本模块中的变量
- getattr(sys. modules[name], “要反射的变量名”)
模块的搜索路径:import sys print(sys.path),就看sys.path里面有没有要导入的路径
模块的循环引用
-
在模块的导入中,不要陷入模块的循环引用中
-
如果发现明明写在这个模块里面的方法,缺找不到
包
什么是包?
- 结合了一组py,提供了一组复杂功能
为什么要有包?
- 当提供的功能比较复杂,一个py文件写不下的时候
包中都有什么?
- 至少有一个__init__.py
导入包 (读框架源码的时候)
-
如果希望导入包之后,模块能够正常使用,那么要自己去完成init文件的开发
-
相当于执行了这个包下面的__init__.py文件
-
设计一下__init__
-
包中模块 绝对导入
包中模块 相对导入
-
使用了相对导入的模块只能被当做模块执行
-
不能被当做脚本执行