模块的定义:提供一个功能的文件,包是集合一组功能的文件夹,包括init.py文件
一、运行文件的两种方式
- 1、以模块的方式运行,例如:import py文件名
2、以脚本的方式运行,例如:在pycharm或者item等命令行运行
二、name_的用法
name在不同文件中的运行结果是不同的。如果print(name)代码是在当前文件,那么
无论何时运行,打印的结果都是 main ,但是如果当前文件被另外一个文件当作模块导入后,在
另外一个文件的运行结果下,当前文件的打印结果只能是当前文件的文件名- 在程序的编写中,需要把类和函数封装之外的所有的内容都写在if name == “main “下边”
模块反射需注意的:原来sys.modules[‘main‘]获取的是当前文件的内存地址,但是如果当前文件被 作为模块导入时,如果还使用’main‘,那么获取到的只能是当前文件,被导入的模块文件内存地址是获取 不到的,所以需要把’main‘改成name,如果是当前文件,运行的是’main‘,如果是模块执行 运行的是name,即变成了模块名。
```python
'''模块.py'''
import 内置方法
内置方法.login()
print(内置方法.file)
import sys
file = sys.modules['__main__']
print(file)
# 通过sys模块中的modules来获取到当前文件的内存地址
# 输出的结果是:
#***<module '内置方法' from '/Volumes/workspace/python-study/re_st/内置方法.py'>
#这是内置方法中的程序
#<module '内置方法' from '/Volumes/workspace/python-study/re_st/内置方法.py'>
#<module '__main__' from '/Volumes/workspace/python-study/re_st/模块.py'>
'''内置方法.py'''
__all__ = ['login', 'file']
def login():
print("这是内置方法中的程序")
if __name__ == '__main__':
login()
import sys
file = sys.modules[__name__]
# 这里必须写成__name__,无论是脚本文件运行还是模块运行都不会出错
# 如果写成'__main__'时,只能获取到当前文件的内存地址,而无法获取导入模块的内存地址
print('***%s' % file)
#结果是:
#这是内置方法中的程序
#***<module '__main__' from '/Volumes/workspace/python-study/re_st/内置方法.py'>
```
三、all的用法
- all的用法是和from .. import 配合使用的,all= [‘’, ‘’]中的参数是导入的模块中的函数名/变量名
- 如果不在模块中写all,那么导入的是所有的内容,如果通过all来设定,那么导入的就是设定好的变量和函数,
模块中没有写的不会导入。注意事项:
- 同一个文件中同一个模块只能导入一次
当导入模块加载后,模块中的变量和函数都会保存在内存中,如果再修改模块中的数据,程序执行中不会对已保存到内存中的数据产生影响。 - 在模块的使用的时候一定不能出现循环互相引用的问题,例如:A引入B,B引入C,C引入D,D引入A,文件还未加载,程序已经开始引用了。
- 同一个文件中同一个模块只能导入一次