关于import和from xx import xx
一、关于导入模块
1在导入模块的一瞬间,解释其会先通过sys.modules来判断该模块是否已经导入了,True 则不再重复导入,False则会做三件事
1为导入的模块创立心的名称空间
2在心创建的名称空间中运行该代码中的代码
3创建模块的名字,并使用该名称空间作为该模块的当前模块中引用的名字
2关于 " __name__"=="__main__":
当我们把一个模块作为程序运行的入口时,此时该模块的__name__是"__main__;如果我们把模块导入时,此时模块内部的__name__事就该模块自身的名字.
注意:在py中直接输入main可以出现神奇的效果!
3我们还可以对导入的模块进行重新命名:
4 正确的导入模块的顺序:
1. 所有的模块导入都要写在最上面. 这是最基本的
2. 先引入内置模块
3. 再引入扩展模块
4. 最后引入你自己定义的模块
二、关于from xx import xx:
跟import的区别就是可以部分导入,应用在模块内容过多的时候,我们可以选择性的导入要使用的内容:
关于from的注意点:
1自己模块的变量名不要跟导入模块的变量名想冲突,不然系统会覆盖掉导入的变量名
2 自己创建的py文件名字也不要和系统内置的模块重名,同理
3 from xxx import xxx这种形式, import后⾯不可以出现"点" 也就是说from a.b import c是ok的. 但是 from a import b.c 是错误的
三、一些补充
有种特殊的写法:from xx import * 在被导入的这个模块中如果没有写出__all__则默认所有内容都导入;
否则,则导入__all__列表中列出来的所有名字.
四、包
什么是包: 包的本质是文件夹,py里创建的每个文件夹都可以被称之为包,创建包不是为了运行,而是被导入使用,其作用就是将模块文件组织起来,一次来提高程序的结构性和可维护性.py2规定包里面必须存在__init__.py文件,py3沿用了规定,但会在创建文件夹时,自动帮你创建__init__文件
如何创建包: 只要是一个文件夹,有__init__.py 就可以.
1 关于__init__.py文件
不论使用哪种方式导入一个包,只要是第一次导入包\包的任何其他部分,都会先执行__init__py文件,这个文件可以是空,也可以存放一些初始化的代码
注意点:可以在此文件中把包中所有模块都调用进去,但要注意,路径要写绝对路径,否则其他外部模块调用包的时候会报错,写入之后,运行文件,只需调入包名字就可以拥有包中的所有模块了(不常用,因为有时只是想导入包里面的部分模块,这样写会占很大内存.)
包的注意事项:
1. 关于包相关的导入语句也分为import和from xxx import xxx两种, 但⽆论使⽤哪种,
无论在什么位置, 在导入时都必须遵循⼀个原则: 凡是在导入时d带点的. 点左边都必须是⼀
个包. 否则报错. 可以带⼀连串的点. 比如a.b.c
2.如果用from 绝对路径导入包,需要注意你的根目录下能否找到目标包,如果找不到,需要一层层的写
五、包中的绝对导入和相对导入(用于启动的文件一定要写在包的外部)
1绝对导入:是以根目录作为起始
2相对导入:用 .或者 ..作为起始 (此方法不是给自己模块用的,是给用于启动的文件用的)
注意点1: 此方法不是给自己模块用的,是给用于启动的文件用的,原因是py中不允许你运行的程序导包的时候超过当前包的范围(相对导入),如果使用绝对导入,则没这个问题;
注意点2:导入包的过程中出错,先看print(sys.path.__str__())或者输入指令:print(sys.path)(sys是关于pycharm操作系统的模块,path是路径,合起来,意为查看路径) ,确认下是否真的能获取到包的信息
注意点3: ./是在当前目录;../是返回上级目录下 #可以在cmd窗口进行验证