if __name__ == '__main__的理解
模块之间引用不能循环成环,圆圈
模块的收搜
!!!把模块当作脚本执行
什么叫模块:py文件,如果一个py文件被导入了,他就是一个模块,
模块没有具体的调用过程
但是能对外提供功能
什么叫脚本:py文件,如果这个py文件直接被执行,这个被直接执行的文件就是一个脚本(点击右键运行这个py文件)
前提介绍:py文件叫login,文件内的函数叫log_in
当一个py文件(名字叫Login.py)当作脚本执行的时候,能够独立完成登录功能
print('__name__:', repr(__name__))
返回:__name__: '__main__'
结论:当一个py文件被当作脚本执行的时候,__name__是一个字符串数据类型的'__main__'。即__name__等于'__main__'这个py文件本身,被当作脚本,可以这样去理解
当一个py文件定义成模块的时候(login模块名)被当导入的时候需要等待调用才能完成功能
import login
login.log_in
__name__: 'login'
结论:当一个py文件被当作模块被导入的时候,__name__是一个字符串数据类型的模块名。即
__name__等于 'login'这个模块名,被当作模块,可以这样理解
问题?就是说在一个py文件里,怎么控制他当作脚本执行的时候,他去执行他里面的函数调用,而同时这个py文件被当做模块被调用的时候,不执行俩次(因为被当作脚本执行时,函数有调用才能被执行嘛,如果被当作模块导入时就会被打印俩次。)
说白了就是去加个开关去判断他是被当作脚本执行呢还是被当作模块导入。怎么做?
所以就可以这样去判断:
在这个login.py文件里:
内容如下:
def log_in:
print('我是脚本文件')
if __name__ == '__main__':#这用法是固定的
log_in()
老师总结:
只要当前这个文件直接被执行,就会执行if条件语句内的代码
当前这个文件是引入模块的时候被执行,就不会执行if条件内语句內的代码。
#意思是说:__name__等于__main__这个py文件本身的时候,我就走下面的log_in()然后就执行。
#这样就可以控制Login这个py文件被当作模块被导入时,不会打印俩次。其实可以简单理解为__name__和__main__就是这个文件名,如果文件名等于文件,就当作脚本执行,就执行这个py文件打印调用结果,如果这个文件名等于这个模块名的时候就不去执行模块内的调用,就是说当作模块时不被调用俩次,你想调用模块的函数要自己手动调,而不是直接就全部将模块内的东西直接调用过来就打印结果了。