帅爆太阳的男人
1,from import ,仍然相当于执行了整个py文件,命名空间发生了改变
- 1.1>导入什么,就能使用什么,不导入的变量不能使用,不导入并不意味着不存,而是没有建立文件到模块中其他名字的引用
- form my_module import login
- login().................直接执行模块中的login函数
- 当模块中导入的方法或者变量和本文件重名的时候,那么这个名字只代表最后一次对它赋值的那个方法或者变量
在文件中对全局变量的修改是完全不会影响到模块的变量引用的(你只修改的是引用的名字,而对模块中的)
- 1.2>重命名
- from my_module import login as l.........导入模块中的login函数并命名成 l ,在这里重命名也只是引用名的改变
- l()....................................................执行模块中的login函数
- 1.2.1>从模块中导入多个变量
- from my_module import login ,name
这时导入的login函数和name变量都能被引用了
- 1.2.2>从模块中导入多个变量的重命名
- from my_module import login as l,name as n
- 此时就可以 l() ;来执行模块中的login函数,用n来执行模块中的变量n
- 1.3>可以用__all__来控制导入的内
- from my_module import *..............................这时从模块中导入所有内容
__all__边的中括号可以添加不同的变量名字,只有被添加了才能被引用,不被添加则不能被引用
2,pyc编译文件和重新加载模块
- import aaa导入模块的时候
- python的执行 -------->解释-编译
- 当一个文件作为一个脚本被导入的时候,就会在这个文件所在的目录的__pycache__下生成一个编译好得到文件,为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以,这样可以节省一些导入时候的时间(就是一次缓存好,以后就可以直接访问,无需再去编译文件)
3.把模块当成脚本运行
- 3.1>以模块的形式运行
- import ,my_module
- if __name__ == "__main__":.................增加一个判断,当导入的模块中的__name__等于次文件的"__main__"的时候就执行以模块的方式运行程序(需要不放在类和函数中只在脚本中运行,不在模块中运行)
my_module.login()
- 3.2>直接在pycharm中运行,cmd运行
- 以脚本的形式运行
- if __name__ == "__main__":................判断当此文件的__name__等于 "__main__"时,就以脚本运行(相等就意味着在一个文件下,因此执行脚本运行)
直接运行
在编写py文件的时候
- 所有不在函数和类中封装的内容都应该写在:
- if __name__ == "__main__"下面
- import sys
- import my_module了所有导入的文件的名字和这个问价的内存地址
sys.moduls.....................{"sys":文件的内存地址,"my_module":my_module的内存地址}存储了所有导入文件的名字和这个文件的内存地址
在使用反射自己模块中的内容的时候
- 直接导入模块就好了............import my_module
在模块的里边要导入 import sys
反射自己模块中的内容时,
- getattr(sys.modules[__name__],"变量名")
4,模块搜索路径
在导入的模块不同级的时候,需要模块搜索路径,在同级的情况下模块的导入可以直接导入,不同级的情况下就需要去搜索路径,并且需要把要导入的模块的绝对路径添加到sys.path列表中
- 4.1>同级(是指在同一个文件夹下或者同一个包下)路径下,直接导入模块即可
- 4.2>在不同级的情况下,需要搜索路径,再导入模块
以下是要导入的模块(用到了反射)
5,重新加载模块
import sys sys.path.append("D:/python/帅爆太阳的男人/Python学习笔记/日记") from text.bbb import b1 import time time.sleep(20) importlib .reload(b1) # 不推荐使用,模块一次性写好
6,模块的循环引用
- 在模块的导入中,不要产生循环信用问题
- 如果发生循环导入
- 就会发现明明写在这个模块中的方法,就是显示找不到了
7,包:包是通过使用"模块名"来组织python模块名称空间的方法
- 7.1>无论是import形式还会from....import形式,凡是在导入语句中(而 不是在使用时)遇到带点的(.),都要第一时间提高警觉:这是关于包才有的导入语法
- 7.2>包是目录级的(文件夹级),包里边方的是一个个的py文件,包的本质就是一个(包含__init__.py文件的目录)
- 7.3>import导入文件时,产生名称空间的名字来源于文件,import包,产生的名称空间同样来源于文件,即(包下__init__.py),导入包就是导入该文件
重点:
- 1>在python3中,即使包下没有__init__.py文件,import包仍然不会报错,而在python2中,包下一定要有该文件,否则 import会报错
- 2>创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式,模块的集合
导入包的两种方式:
- 第一种,绝对路径:在每一个包下面的__init__文件里丢要路径里都要写入搜索路径
- import sys
- sys.path.append("路径")
- 绝对路径实质就是模块里边导入模块.直至导入自己想用的模块
- 第二种,相对路径:在每一个包下面__init__只需加入from . import 文件名,这里的.是返回上一层目录
8,代码的规范: