24- 1 模块
import 模块
调用方法: 模块名.名字
from ... import ...
使用方法:导入这个模块中的某个名字之后,这个名字就可以直接使用了
- 名字是变量 直接用
- 名字是函数 函数名()就是调用
- 名字是类名 类名()就是实例化
- 导入了什么 就能使用什么 不导入的变量 不能使用
- 不导入并不意味着不存在 而是没有建立文件到模块中其他名字的引用
- 当模块中导入的方法或者变量 和 本文件重名的时候,那么这个名字只代表最后一次对它赋值的哪个方法或者变量
- 在本文件中对全局变量的修改是完全不会影响到模块中的变量引用的
sys.path 一个自定义模块能否被导入,就看sys.path列表中有没有这个模块所在的绝对路径
import 模块名 # ModuleNotFoundError : No module named '模块名'
如果没有,可以试试sys.path.append("文件绝对路径")
from my_module import login login() from my_module import name print(name)
重命名
from my_module import login as l l()
导入多个
from my_module import login,name login() print(name) name = '太亮' login()
导入多个之后再重命名
from my_module import login as l,name as n
from 模块 import *
login()
name
导入模块的过程是:
import aaa python的执行 # 解释 - 编译 # 当一个文件作为一个脚本被导入的时候 # 就会在这个文件所在的目录的__pycache__下生成一个编译好的文件 # 为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以 # 可以节省一些导入时候的时间
__all__可以控制*导入的内容
* 和 __all__ 的相关性
被导入脚本: 写入__all__ = ['当前文件的方法',"当前文件的key"]
只能调用列表中的属性方法
运行一个py文件的两种方式
1.以模块的形式运行(被调用)
import my_module if __name__ == '__main__': my_module.login()
2.直接pycharm运行 cmd运行
以脚本的形式运行,需要在本文件中直接打印的代码上加上if __name__ == '__main__':
在编写py文件的时候所有不在函数和类中封装的内容都应该写在if __name__ == '__main__':下面
import sys import my_module sys.modules {存了所有的 文件名:文件内存地址} {'sys':文件的内存地址,'my_module': my_module的地址 '__main__':当前直接执行文件所在的地址}
__main__ :是可变的,哪个文件run(被导入的情况),他就是这个文件的名字和这个文件的内存地址
__name__: 不变的,不管哪里导入我当前的文件,我代表的永远是我现在文件的名字和这个文件的内存地址
咦?得到了启发: 在反射文件模块的时候要注意了 要用不变的__name__
import sys def xx(): print('s') a = 123 getattr(sys.modules[__name__], 'xx')() # s print(getattr(sys.modules[__name__], 'a')) # 123
模块搜索路径 sys.path
import sys print(sys.path) sys.path.append('D:\sylar\python_workspace') 总结 模块的搜索路径全部存储在sys.path列表中 导入模块的顺序,是从前到后找到一个符合条件的模块就立即停止不再向后寻找 如果要导入的模块和当前执行的文件同级 直接导入即可 如果要导入的模块和当前执行的文件不同级 需要把要导入模块的绝对路径添加到sys.path列表中
当前文件导入了模块,咱们可以调用他,但是不能改变之前模块的内容
在模块的导入中 不要产生循环引用问题
如果发生循环导入了
就会发现明明写在这个模块中的方法,确偏显示找不到
3.pyc编译文件
4.重新加载模块 已经导入的模块即便被修改在程序执行过程中也不会生效
5.模块的循环引用 - 不允许
包
从包中导入模块,要注意这个包所在的目录是否在sys.path
from aaa.bbb.ccc import get # 正确的
from bbb.ccc import get # ModuleNotFoundError: No module named 'bbb'
get.func()
- 是直接导入一个包,那么相当于执行了这个包中的__init__文件
- 并不会帮你把这个包下面的其他包以及py文件自动的导入到内存
- 如果你希望直接导入包之后,所有的这个包下面的其他包以及py文件都能直接通过包来引用
- 那么你要自己处理__init__文件